2016-05-21 4 views
3

Ist es möglich, Eigenschaften von JSON mit einem komplexen Pfad, wie "prop1.prop2"? Probe von JSON I verwendet:F # JSON-Parsing - Wie man eine Eigenschaft mit einem komplexen Pfad (bestehend aus mehreren Propery-Namen) bekommt

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

Was ich will haben, ist Eigentum zu erhalten "prop2" dort mit seinem Wert "value": Als ich versuchte:

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

Ich habe:

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

Ich habe versucht, eine solche Methode selbst zu schreiben, aber es sieht plump aus:

Antwort

4

können Sie tun das, trivially with JSON.net:

open Newtonsoft.Json.Linq 

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

Offensichtlich gibt bei diesem Ansatz keine Typsicherheit ist, aber das ist der Kompromiss, wenn Sie in der Lage sein wollen Abfrage mit beliebigen Strings.

5

In FSharp.Data finden Sie eine JSonProvider, mit der Sie Eigenschaften (und mehr, wenn Sie wollen) von einem JSON-Objekt mit komplexen Pfad abrufen können. Sie können etwas tun und es sollte für Sie arbeiten:

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

let testSample = test.GetSample() 

let testValue = testSample.Prop1.Prop2 

und Sie werden den zurückgegebenen Wert sein: val testValue : string = "value"

Sie haben vorsichtig sein, dass, was Sie geben als Parameter an die JSonProvider ist eine String-Repräsentation Ihres Json-Objekts.

Ich hoffe, das hilft :)

+0

Danke Leleutch. Ich versuchte JsonProvider. Aber mein Problem ist, dass ich dynamisch auf JSON zugreifen muss, also habe ich wirklich eine JSON-Datei und einen Pfad zum JSON-Token (was ich vorher nicht weiß). Leider konnte ich nicht so programmieren, wie Sie es vorgeschlagen haben. Was ich tatsächlich gesucht habe, war ähnlich http://stackoverflow.com/questions/19645501/searching-for-a-specific-jtoken-by-name-in-ajobject-hierarchy –

Verwandte Themen