Почему я должен использовать List <> вместо массива в десериализации JSON? - PullRequest
6 голосов
/ 10 февраля 2012

Прежде всего, позвольте мне сказать вам одну вещь, которую я задаю этот вопрос, просто для рвения и расширения моих знаний.Надеюсь, что вы можете очистить мои сомнения!

Теперь давайте подойдем к делу

Я получил этот вопрос из моего предыдущего вопрос-ответ

На самом деле проблемаэто если я использую

List<oodleListings> listings;

вместо

oodleListings[] listings;

Это прекрасно работает !!Я могу легко десериализовать мою строку json.

Теперь проблема в том, почему массив не поддерживается при десериализации json?

Какова реальная причина использования List вместо * 1021?*?

Ответы [ 3 ]

4 голосов
/ 10 февраля 2012

Ваша проблема не связана с Array s или Lists. Смотрите примеры классов ниже

public class TestClassList
{
    public List<User> users;
}

public class TestClassArray
{
    public User[] users;
}

public class User
{
    public string user;
}

и предположим, что ваша входная строка string json1 = "{ users:[{user:'11'},{user:'22'}] }";

var obj1= ser.Deserialize<TestClassList>(json1);
var obj2 = ser.Deserialize<TestClassArray>(json1);

обе десериализации будут работать ..

Но если вы попытаетесь десериализовать эту строку string json2 = "{ users:{user:'11'} }";

var obj3 = ser.Deserialize<TestClassList>(json2);
var obj4 = ser.Deserialize<TestClassArray>(json2);   //<--ERROR  

вы получите ошибку во второй строке (Althoug в первой строке не выдает ошибку, он также не возвращает действительный объект).

В результате: вторая строка json не содержит массив пользователей, поэтому вы получаете No parameterless constructor defined for type of 'User[]'.

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

Нет ничего плохого в Array или List. Я только что попробовал ваш код, и он работает без проблем для Array и List.

В вашем предыдущем вопросе вы не указали сериализованную строку JSON, иначе она была бы решена сама по себе. Вы можете проверить этот пост из ASP.Net.

1 голос
/ 10 февраля 2012

List<T> не имеет фиксированной длины, поэтому вы можете добавлять элементы к этому объекту, не зная его размера.Список, безусловно, является более гибким / функциональным классом, но, как побочный эффект, он имеет больший объем памяти.

Кроме того, объект типа List<oodleListing> будет иметь метод AddRange, который принимает методпараметр oodleListing[], так что вы всегда можете десериализовать и затем добавить в свой родовой класс.

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