2015-06-15 18 views
5

Ho un frammento di JSON che assomiglia a questo:Deserialize JSON malformati con JSON.NET

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

Il 123 è un ID e può cambiare a ogni richiesta. Questo è al di fuori del mio controllo.

Desidero deserializzare il JSON utilizzando JSON.NET. Ho provato:

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

Tuttavia, questo non funziona a meno che io definisco l'attributo JsonProperty in questo modo:

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

Ma ovviamente non posso effettivamente fare questo perché l'ID 123 cambierà a ogni richiesta .

Come posso leggere la proprietà ID utilizzando JSON.NET e applicarlo alla classe ID?

+1

Funzionerebbe con un 'KeyValuePair '. Si può provare a deserializzarlo in un buffer 'object' temporaneo e quindi associarlo all'istanza' User'. –

+2

Non è malformato; appena formato goffamente. Fondamentalmente si tratta di un KVP di in cui l'utente ha proprietà 'nome' e 'info' –

+0

Ho pensato, Nella tua classe, la struttura deve essere definita di prima classe RootObject. Nella classe Rootobject, devi dichiarare tutto l'attributo json come metodo get set. –

risposta

4

Prova questa:

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(); 

Questo ha alcuni inutile sovraccarico, ma considerando le circostanze, sarebbe fare.

+1

Concordato ma funziona - grazie. –

0

ne dite di avere JSON formato come segue (se è consentito a tutti cambiando schema JSON):

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

In questo modo deve essere possibile.

+0

Mi dispiace non è consentito - L'ho fatto in grassetto nella domanda ;-) –

1

lo farei in questo modo:

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

Grazie - interessante ma difficile da ottenere ora i dati dell'utente reale. –

+1

lo so ... ma puoi deserializzare anche l'oggetto nidificato ... aggiorna la mia risposta. – stefankmitph

Problemi correlati