F#JSON解析

编程入门 行业动态 更新时间:2024-10-10 21:33:58
F#JSON解析 - 如何使用复杂路径获取属性(由多个地名组成)(F# JSON parsing - How to get property using complex path (consisting of several propery names))

是否可以使用复杂路径从JSON获取属性,如"prop1.prop2" ? 我使用的JSON示例:

{ "prop1": { "prop2": "value" } }

我想要的是"prop2"的价值"value"获得财产"prop2" "value" :当我尝试:

#r "../packages/FSharp.Data.2.3.0/lib/net40/FSharp.Data.dll" open FSharp.Data open FSharp.Data.JsonExtensions let json = JsonValue.Load "SampleJson.json" json.GetProperty("prop1.prop2")

我有:

System.Exception: Didn't find property 'prop1.prop2' in {"prop1":{"prop2":"value"}}

我试图自己写这样的方法,但看起来很笨拙:

let rec tryGetChildValue (propNameSplitted : List<string>) (json:JsonValue) = match propNameSplitted with | [] -> None | [x] -> json.TryGetProperty (x) | x::xs -> match json.TryGetProperty (x) with | Some p -> tryGetChildValue xs (json.GetProperty(x)) | None -> None let tryGetPropValue (propName: string) (json:JsonValue) = let s = propName.Split '.' |> Array.toList tryGetChildValue s json let propName = "prop1.prop2" let result = (tryGetPropValue propName json)

Is it possible to get property from JSON using complex path, like "prop1.prop2"? Sample of JSON I used:

{ "prop1": { "prop2": "value" } }

What I have want is to get property "prop2" there with its value "value": When I tried:

#r "../packages/FSharp.Data.2.3.0/lib/net40/FSharp.Data.dll" open FSharp.Data open FSharp.Data.JsonExtensions let json = JsonValue.Load "SampleJson.json" json.GetProperty("prop1.prop2")

I got:

System.Exception: Didn't find property 'prop1.prop2' in {"prop1":{"prop2":"value"}}

I tried to write such method by my own, but it looks clumsy:

let rec tryGetChildValue (propNameSplitted : List<string>) (json:JsonValue) = match propNameSplitted with | [] -> None | [x] -> json.TryGetProperty (x) | x::xs -> match json.TryGetProperty (x) with | Some p -> tryGetChildValue xs (json.GetProperty(x)) | None -> None let tryGetPropValue (propName: string) (json:JsonValue) = let s = propName.Split '.' |> Array.toList tryGetChildValue s json let propName = "prop1.prop2" let result = (tryGetPropValue propName json)

最满意答案

你可以用JSON.net来做这件事 :

open Newtonsoft.Json.Linq let query json = let j = JObject.Parse json j.SelectToken "prop1.prop2" |> string

显然,这种方法没有类型安全性,但如果您想使用任意字符串进行查询,那么这是一种折衷。

You can do that trivially with JSON.net:

open Newtonsoft.Json.Linq let query json = let j = JObject.Parse json j.SelectToken "prop1.prop2" |> string

Obviously, there's no type safety with this approach, but that's the trade-off if you want to be able to query using arbitrary strings.

更多推荐

本文发布于:2023-04-29 10:17:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1335622.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:JSON

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!