2015-06-15 24 views
5

Ich habe einen Ausschnitt aus JSON, das wie folgt aussieht:Deserialize malformed JSON mit JSON.NET

{"123":{"name":"test","info":"abc"}} 

Die 123 ist eine ID und kann auf jede Anforderung ändern. Das ist außerhalb meiner Kontrolle.

Ich möchte das JSON mit JSON.NET Deserialisieren. Ich habe versucht:

[JsonProperty("123")] 
public string ID { get; set; } 

Aber natürlich kann ich nicht wirklich das tun, weil die ID 123 bei jeder Anfrage ändert:

User u = JsonConvert.DeserializeObject<User>(json); 

Dies ist jedoch nicht, wenn ich das JsonProperty Attribut wie so definieren funktioniert .

Wie kann ich die ID-Eigenschaft mit JSON.NET lesen und auf die ID-Klasse anwenden?

+1

Es würde mit einem 'KeyValuePair ' funktionieren. Sie könnten versuchen, es in einem temporären "Objekt" -Puffer zu deserialisieren und es dann Ihrer "User" -Instanz zuzuordnen. –

+2

Es ist nicht missgebildet; nur ungeschickt geformt. Im Grunde ist es ein KVP von , wo Benutzer Eigenschaften 'Name' und 'Info' hat –

+0

Ich dachte, in Ihrer Klassenstruktur muss RootObject erster Klasse definiert werden. In der Klasse Rootobject müssen Sie alle json-Attribute als get-set-Methode deklarieren. –

Antwort

4
diese

Versuchen:

var json = "{\"123\":{\"name\":\"test\",\"info\":\"abc\"}}"; 

var rootObject = JsonConvert.DeserializeObject<Dictionary<string, User>>(json); 
var user = rootObject.Select(kvp => new User 
            { ID = kvp.Key, 
             Name = kvp.Value.Name, 
             Info = kvp.Value.Info 
            }).First(); 

Diese etwas unnötigen Overhead hat, aber die Umstände bedenkt, würde es tun.

+1

Einverstanden aber funktioniert - danke. –

0

Wie wäre es hat JSON wie folgt gebildet (wenn überhaupt ändernden JSON Schema erlaubt ist):

{ 
    "ID": "123", 
    "Properties":{"name":"test","info":"abc"} 
} 

diese Weise ist es möglich sein muss.

+0

Entschuldigung nicht erlaubt - Ich habe es in der Frage gewagt ;-) –

1

ich es auf diese Weise tun würde:

dynamic result = JsonConvert.DeserializeObject(json); 

var myObject = result as JObject; 
var properties = myObject.Properties(); 
var property = properties.FirstOrDefault(); // take first element 
string name = property.Name; 

foreach (var item in properties) 
{ 
    var jProperty = item as JProperty; 
    var nestedJson = jProperty.Value.ToString(); 
    dynamic nestedResult = JsonConvert.DeserializeObject(nestedJson); // or put it into a model/data structure 
} 
+0

Danke - interessant aber knifflig, um jetzt die eigentlichen Benutzerdaten zu bekommen. –

+1

ich weiß ... aber Sie können das verschachtelte Objekt auch deserialisieren ... aktualisiert meine Antwort. – stefankmitph

Verwandte Themen