2016-04-02 8 views
2

Ich versuche, JSON zu deserialisieren. Mein Root-Objekt hat eine einzige Eigenschaft "en.pickthall". Ich verwende den dynamischen Typ zum Lesen meines JSON. Ich dachte, ich könnte einfach mit "." in der Eigenschaft seit seiner JSON-Datei lokal, aber dann muss es eine Möglichkeit geben, eine solche EigenschaftZugriff auf Eigenschaften mit einem Punkt in ihrem Namen

var result = App_Code.FileIOHelper.ReadFromDefaultFile("ms-appx:///Assets/en.pickthall.json"); 

dynamic stuff = JsonConvert.DeserializeObject(result); 

foreach(var x in stuff.(en.pickthall)) //Tried this intellisense didn't like it 
{ 

} 
+0

Können Sie stattdessen die DataContractJsonSerializer-Klasse verwenden? http://forums.asp.net/post/5030923.aspx –

Antwort

2

C# für den Zugriff haben keine Möglichkeit, Kennungen zu zitieren. Wenn es kein gültiger Bezeichner ist, ist Ihre einzige Option die Reflektion.

Es ist jedoch möglich, dass das von Ihrem JSON-Deserializer zurückgegebene Objekt die Bezeichner so geändert hat, dass sie in C# verwendbar sind. Möglicherweise möchten Sie alle Eigenschaften auflisten, um zu prüfen, ob dies der Fall ist. Ein dynamisches Objekt mit Indexern könnte auch eine Lösung sein (z. B. stuff["en.pickthall"]).

Eine weitere Alternative besteht darin, die Art und Weise zu ändern, in der der Serializer Eigenschaften mappt. Mit Newtonsoft.Jsoft können Sie dies beispielsweise anpassen, indem Sie IContractResolver verwenden. Es ist ziemlich einfach, die . für etwas mehr C# -Sane auf diese Weise zu ersetzen.

1

könnten Sie Serialisierung nicht dynamisch, sondern auf JObject und dann Zugriff auf Ihre Immobilie über

JObject stuff = JsonConvert.DeserializeObject<JObject>(Jsonstring); 
var x = stuff.Value<String>("my.property") 
0

Mit einem dynamischen Objekt und NewtonSoft.Json:

dynamic json = JValue.Parse(result); 

    int Opens = Convert.ToInt32(json.opens); 

    int Clicks = Convert.ToInt32(json.clicks); 

    string State = json.state; 
+1

Das löst das ursprüngliche Problem von Eigenschaften mit einem Punkt in dem Name nicht. – derpirscher

2

Sie könnten eine Stammklasse erstellen deserialisieren in und verwenden JsonProperty:

public class Root 
{ 
    [JsonProperty(PropertyName = "en.pickthall")] 
    public object EnPickthall { get; set; } 

    public Root() {} 

    public Root(en_pickthall) 
    { 
     this.EnPickthall = en_pickthall; 
    } 
} 

Sie können dann rufen

Root stuff = JsonConvert.DeserializeObject<Root>(result); 

foreach(var x in stuff.EnPickthall) 
{ 

} 
0

Ich weiß, Sie sagten, Sie einen dynamischen Typ für Ihre JSON Deserialisierung verwendet haben, aber ich wollte nur darauf hinweisen, dass es da draußen eine .NET RESTful-Client ist, dass diese mit statischen Modelldefinitionen unterstützt auch. Für Sie oder für jeden, der auf diese Antwort reagiert, wenn Sie in C# -REST-Aufrufen nach einer Antwort auf ihre Probleme mit Punkten in Eigenschaftsnamen suchen.

Ab dem neu erschienenen RestSharp 106.1.0 (und ich diese Version bedeuten, weil diese Unterstützung gerade hinzugefügt wurde), kann damit umgehen Eigenschaften mit einem Punkt in ihrem Namen umbenennen über die DeserializeAs zuschreiben. Ein Beispiel ist, wenn ich die Elasticsearch API für einen _cat Aufruf mit dem folgenden Modell nennen:

public class CatResponse 
{ 
    public string index { get; set; } 
    ... 
    [DeserializeAs(Name = "docs.count")] 
    public string docscount { get; set; } 
} 

Und tatsächlich bekommen jetzt die docs.count Eigenschaft deserialisiert in docscount zurück:

var resource = $"_cat/indices/{indexPattern}?format=json&pretty=true"; 

var request = new RestRequest(resource, Method.GET); 
var response = client.Execute<List<CatResponse>>(request); 

Diese Unterstützung ist out of the box und muss nicht die Newtonsoft.Json.JsonSerializer verwenden, die ich auch gehört habe, ist eine mögliche Lösung für dieses Problem, aber die ich nicht zur Arbeit bekommen konnte.

Verwandte Themen