Как заставить объект поддерживать десериализацию? - PullRequest
1 голос
/ 09 февраля 2012

Я получаю InvalidOperationException, когда пытаюсь десериализовать строку json для моего объекта person. В нем говорится, что мой объект Person не поддерживается для десериализации

  [DataContract]
  public class Person
  {
    public string FirstName {get;set;}
    public string LastName {get; set;}
    public int Id {get; set;}
  }

Пример строки json

[{"name":"FirstName","value":"John"},{"name":"LastName","value":"Doe"},{"name":"Id","value":"1001"}]

И вот где я получаю свое исключение

  Person p = new JavaScriptSerializer().Deserialize<Person>(json);

Я тоже попробовал DataContractJsonSerializer без особой удачи.

Ответы [ 2 ]

3 голосов
/ 09 февраля 2012

Проблема здесь в том, что строка json представляет собой массив человек (людей?!?), А не один Person.

Измените десериализацию на

Person[] p = new JavaScriptSerializer().Deserialize<Person[]>(json);

и это сработает.

[Редактировать - в ответ на ваш комментарий] Да, это даст три экземпляра Person, и фактически они будут иметь свойства null / zero.

Я подозреваю, что вы действительно ожидали, что эта строка json даст вам ваш оригинальный код:

string json = "[{\"FirstName\":\"John\", \"LastName\":\"Doe\",\"Id\":\"1001\"}]";

это единственный человек, Джон Доу, с идентификатором 1001. Но это не то, что говорит JSON, если десериализовать в Person.

То, что вы изначально json можете быть десериализованным, представляет собой массив пар имя / значение, подобный этому:

public class NameValuePair
{
    public string name;
    public string value;
}

используя это

var p = new JavaScriptSerializer().Deserialize<NameValuePair[]>(json);

Надеюсь, этот фрагмент немного лучше иллюстрирует отношения между json и классом.

2 голосов
/ 09 февраля 2012

Я проверил ваш код и обнаружил проблему.

В вашей строке jSon содержится массив Person.Измените на Person[], и оно будет работать.

Вот мой тестовый код

string json = "[{\"name\":\"FirstName\",\"value\":\"John\"},{\"name\":\"LastName\",\"value\":\"Doe\"},{\"name\":\"Id\",\"value\":\"1001\"}]";
Person[] p = new JavaScriptSerializer().Deserialize<Person[]>(json);

Обновление

Ваша строка jSon имеет неправильный формат.Deserializer не может найти свойство для назначения ваших значений.

Право будет.

{ "NameOfProperty" : "ValueOfProperty" }

Это правильный формат

[{"FirstName":"Jon", "LastName":"Doe"}, {"FirstName":"Jon", "LastName":"Doe"}]

Тестовый код

string json = "[{\"FirstName\":\"Jon\", \"LastName\":\"Doe\"}, {\"FirstName\":\"Jon\", \"LastName\":\"Doe\"}]";
Person[] p = new JavaScriptSerializer().Deserialize<Person[]>(json);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...