2016-05-21 6 views
3

複雑なパスを使用してJSONからプロパティを取得することは可能ですか?"prop1.prop2"?私が試したとき ::私が使用したJSONの サンプル:F#JSON解析 - 複雑なパスを使用してプロパティを取得する方法(複数のプロパティ名からなる)

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

を私がしたい持っているものは、その値"value"とそこにプロパティ"prop2"を取得することです

#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) 

答えて

4

あなたはtrivially with JSON.netことを行うことができます。

open Newtonsoft.Json.Linq 

let query json = 
    let j = JObject.Parse json 
    j.SelectToken "prop1.prop2" |> string 

は明らかに、このアプローチとは型の安全性はありませんが、あなたのことができるようにしたい場合には、トレードオフです任意の文字列を使用したクエリ。

5

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オブジェクトのString表現です。

私はそれが役に立てば幸い:)

+0

ありがとうLeleutch。 私はJsonProviderを試しました。しかし、私の問題は、JSONに動的にアクセスする必要があることです。実際にはJSONファイルとJSONトークンへのパスがあります(あらかじめわからない)。だから、残念ながら、私はあなたが示唆するようにコードすることができませんでした。 私が実際に検索した内容はこれと似ていました。http://stackoverflow.com/questions/19645501/searching-for-a-specific-jtoken-by-name-in-a-jobject-hierarchy –

関連する問題