Как десериализовать JSON с именем объекта - PullRequest
0 голосов
/ 19 ноября 2010

Я не совсем уверен, как сформулировать проблему, но у меня есть следующий json:

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

И десериализация с использованием json.net/javascriptserializer(asp.net) У меня есть следующий тестовый код:

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

Метод теста не пройден, поскольку оба имеют значение null. Что-то не так с моим кодом для десериализации?

Ответы [ 3 ]

1 голос
/ 19 ноября 2010

Вам нужен промежуточный класс здесь:

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; }
}

и затем:

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 голосов
/ 19 ноября 2010

Это сделает это:

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

[EDIT] Ой, подождите ... возможно, вы не контролируете JSON, который получаете, и не можете его изменить. Если это так, то решение Дарина будет то, что вам нужно.

0 голосов
/ 19 ноября 2010

Проверьте объект в отладчике, но я подозреваю, что вам нужно проверить doe.person.first_name и doe1.person.first_name

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...