F#JSON解析-如何使用复杂路径(由几个属性名称组成)获取属性 [英] F# JSON parsing - How to get property using complex path (consisting of several propery names)

查看:223
本文介绍了F#JSON解析-如何使用复杂路径(由几个属性名称组成)获取属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

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

我想要的是在那里获取属性"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")

我得到了:

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)

推荐答案

您可以

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

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.

这篇关于F#JSON解析-如何使用复杂路径(由几个属性名称组成)获取属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆