F#JSON解析 - 如何使用复杂路径获取属性(由多个属性名称组成)

Ale*_*niy 4 f# json f#-data

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

{
    "prop1": {
        "prop2": "value"
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要的是"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")
Run Code Online (Sandbox Code Playgroud)

我有:

System.Exception: Didn't find property 'prop1.prop2' in {"prop1":{"prop2":"value"}}
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

Mar*_*ann 6

你可以用JSON.net做到这一点:

open Newtonsoft.Json.Linq

let query json =
    let j = JObject.Parse json
    j.SelectToken "prop1.prop2" |> string
Run Code Online (Sandbox Code Playgroud)

显然,这种方法没有类型安全性,但如果您希望能够使用任意字符串进行查询,那就是权衡.


Lel*_*tch 5

在FSharp.Data中,您可以找到一个JSonProvider允许您使用复杂路径从JSON对象获取属性(以及更多,如果需要)的内容.你可以做这样的事情,它应该适合你:

type test =  FSharp.Data.JsonProvider<"""{
    "prop1": {
        "prop2": "value"
    }
} """>

let testSample = test.GetSample()

let testValue = testSample.Prop1.Prop2
Run Code Online (Sandbox Code Playgroud)

并且您将返回值为: val testValue : string = "value"

您必须小心,您作为JSonProvider的参数提供的是Json对象的String表示.

我希望有帮助:)