2010-11-19 29 views
0

Ich bin nicht wirklich sicher, wie das Problem Begriff aber, ich habe folgendes json:Wie Deserialisieren json mit Objektnamen

{ 
    "person": { 
    "first_name": "John", 
    "gender": "M", 
    "last_name": "Doe" 
    } 
} 

Und Deserialisieren mit json.net/javascriptserializer(asp.net) I habe folgenden Testcode:

public class Person 
{ 
    public string first_name { get; set; } 
    public string last_name { get; set; } 
    public string gender { get; set; } 
} 


[Test] 
public void TestDeserialize() 
{ 
    string json = @"{""person"":{""first_name"":""John"",""gender"":""M"",""last_name"":""Doe""}}"; 

    var serializer = new JavaScriptSerializer(); // asp.net mvc (de)serializer 

    Person doe = serializer.Deserialize<Person>(json); 
    Person doe1 = JsonConvert.DeserializeObject<Person>(json); // json.net deserializer 

    Assert.AreEqual("John", doe.first_name); 
    Assert.AreEqual("John", doe1.first_name); 
} 

Die Testmethode schlägt fehl, weil beide null sind. Alles falsch mit meinem Code zu deserialisieren?

Antwort

1

Sie benötigen eine Zwischenklasse hier:

public class Model 
{ 
    public PersonDetails Person { get; set; } 
} 

public class PersonDetails 
{ 
    public string first_name { get; set; } 
    public string last_name { get; set; } 
    public string gender { get; set; } 
} 

und dann:

string json = @"{""person"":{""first_name"":""John"",""gender"":""M"",""last_name"":""Doe""}}"; 
var serializer = new JavaScriptSerializer(); 
var model = serializer.Deserialize<Model>(json); 
Assert.AreEqual("John", model.Person.first_name); 
+0

Danke Darin das funktioniert, es saugt nur, dass Sie ein Zwischenobjekt haben müssen. – bonskijr

+2

Sie benötigen dieses Zwischenobjekt aufgrund Ihrer JSON-Definition. So einfach ist das. Wenn Ihr JSON nicht den Teil "person" enthält, benötigen Sie das Objekt nicht. –

0

das Objekt im Debugger untersuchen, aber ich vermute, dass Sie doe.person.first_name und doe1.person.first_name

0

Dies wird testen müssen tun Sie es:

 string json = @"{'first_name':'John','gender':'M','last_name':'Doe'}";   
     var serializer = new JavaScriptSerializer(); 
     Person doe = serializer.Deserialize<Person>(json); 

[EDIT] Oh, warte ... vielleicht hast du nicht die Kontrolle über den JSON, den du erhältst und kannst ihn nicht ändern. Wenn das der Fall ist, dann wäre Darin's Lösung, was Sie brauchen.