JavaScriptSerializer выдает ArgumentNullException при десериализации - PullRequest
1 голос
/ 23 августа 2011

Я пишу приложение, которое отправляет и получает JSON в / из бэкэнда в Visual C # 4.0.

Очевидно, что самый простой способ сериализации / десериализации JSON - это System.Web.Script.Serialization.JavaScriptSerializer, но у меня странная ошибка, когда он выдает ArgumentNullException, утверждая, что этот тип имеет значение null.

Когда следующий JSON десериализован, он работает нормально:

 {"results":[
      {"Name":"Western Bulldogs",
      "updatedAt":"2011-08-22T09:09:09.673Z",
      "Nickname":"Bulldogs",
      "RemoteId":44,
      "Abbreviation":"WB",
      "createdAt":"2011-08-22T09:09:09.673Z",
      "objectId":"2iSK8FDTA6"}
 ]}

Однако,при десериализации второго (с вложенным словарем) происходит сбой с типом null error.

{"results":[
    {"EndDate":{"iso":"2011-09-06T00:00:00.000Z","__type":"Date"},
    "Name":"Round 24",
    "updatedAt":"2011-08-22T08:33:54.119Z",
    "RemoteId":800,"createdAt":"2011-08-22T08:33:54.119Z",
    "Season":{"className":"Season","__type":"Pointer","objectId":"WnsdqIlrd6"},
    "Order":24,
    "StartDate":{"iso":"2011-08-30T00:00:00.000Z","__type":"Date"},
    "objectId":"bLdBfhagi9"}
]}        

Для справки, я десериализовываюсь с помощью следующего метода для обоих запросов:

JavaScriptSerializer jsSerialise = new JavaScriptSerializer();
ObjectIdContainerList contList = jsSerialise.Deserialize<ObjectIdContainerList>(responseString);

Где ObjectIdContainerList выглядит следующим образом (примечание: он не реализует все свойства исходного объекта JSON, поскольку меня интересует только получение свойства objectId):

[Serializable]
public class ObjectIdContainerList
{
    public ObjectIdContainer[] results { get; set; }
}

[Serializable]
public class ObjectIdContainer
{
    public String objectId { get; set; }
}

Первый запрос десериализуется безпроблема с точно таким же кодом и объектами.

Есть предложения?Буду ли я лучше пойти на JSON.NET?

Ответы [ 2 ]

1 голос
/ 23 августа 2011

Я чувствую себя плохо из-за того, что отвечаю на свой вопрос, но в итоге я решил проблему с помощью Json.Net для десериализации объекта практически с тем же кодом, и это сработало.

Я не склонен говорить, что это ошибка в .Net framework, но вроде как так.

Спасибо тем, кто помог!

1 голос
/ 23 августа 2011

Я не понимаю, какова цель ObjectIdContainerList, когда вы можете просто сделать это:

jsSerialise.Deserialize<List<ObjectIdContainer>>(responseString) 
and get a List of ObjectIdContainer

Я бы также удостоверился, что ObjectIdContainer имеет свойство с именем "__type", которое содержит строку. Я упоминаю об этом, потому что это странное имя для свойства класса в C #.

РЕДАКТИРОВАТЬ: я только что увидел, что вы опубликовали остальную часть вашего кода ...

Вы говорите, что ожидаете, что сможете десериализовать строку ответа в массив ObjectIdContainer, где ObjectIdContainer имеет только свойство с именем objectId? Я был бы очень впечатлен, если бы вам удалось заставить это работать.

Я помню, как Reflector однажды показал мне, что реализация JavascriptSerializer в основном использует отражение для сериализации / десериализации объектов; следовательно, вам нужен соответствующий класс с теми же именами свойств, которые определены в вашем объекте JSON, иначе он потерпит неудачу.

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