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"
:
当我尝试时:
#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)
在 FSharp.Data 中,您可以找到一个 JSonProvider
,它允许您使用复杂路径从 JSON 对象获取属性(如果需要,还可以获取更多属性)。你可以做这样的事情,它应该适合你:
type test = FSharp.Data.JsonProvider<"""{
"prop1": {
"prop2": "value"
}
} """>
let testSample = test.GetSample()
let testValue = testSample.Prop1.Prop2
你将得到返回值:val testValue : string = "value"
您必须小心,作为参数提供给 JSonProvider 的是 Json 对象的字符串表示形式。
希望对您有所帮助:)
你可以做到 trivially with JSON.net:
open Newtonsoft.Json.Linq
let query json =
let j = JObject.Parse json
j.SelectToken "prop1.prop2" |> string
显然,这种方法没有类型安全性,但如果您希望能够使用任意字符串进行查询,这就是权衡。
是否可以使用复杂路径从 JSON 获取 属性,例如 "prop1.prop2"
?
我使用的JSON样本:
{
"prop1": {
"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)
在 FSharp.Data 中,您可以找到一个 JSonProvider
,它允许您使用复杂路径从 JSON 对象获取属性(如果需要,还可以获取更多属性)。你可以做这样的事情,它应该适合你:
type test = FSharp.Data.JsonProvider<"""{
"prop1": {
"prop2": "value"
}
} """>
let testSample = test.GetSample()
let testValue = testSample.Prop1.Prop2
你将得到返回值:val testValue : string = "value"
您必须小心,作为参数提供给 JSonProvider 的是 Json 对象的字符串表示形式。
希望对您有所帮助:)
你可以做到 trivially with JSON.net:
open Newtonsoft.Json.Linq
let query json =
let j = JObject.Parse json
j.SelectToken "prop1.prop2" |> string
显然,这种方法没有类型安全性,但如果您希望能够使用任意字符串进行查询,这就是权衡。