исключение пустого значения, генерируемое при десериализации пустого значения JSON.net - PullRequest
2 голосов
/ 07 июня 2010

Привет, друзья! Я пытаюсь десериализовать скрытое поле управления в объект JSON, код которого выглядит следующим образом:

Dim settings As New Newtonsoft.Json.JsonSerializerSettings() 
settings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore
Return Newtonsoft.Json.JsonConvert.DeserializeObject(Of testContract)(txtHidden.Text, settings) 

Но я получаю следующее исключение. value cannot be null parameter name s: Я даже добавил следующие строки, но все равно не получается. Пожалуйста, помогите.

settings.MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Ignore
settings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore 
settings.ObjectCreationHandling = Newtonsoft.Json.ObjectCreationHandling.Replace 

Ответы [ 2 ]

7 голосов
/ 12 августа 2010

У меня было такое же точное сообщение об ошибке, как и при попытке вызвать тот же метод.Убедитесь, что у вас есть конструктор по умолчанию (конструктор без параметров) для вашего целевого класса (ваш testContract класс).

В C # ваш класс и конструктор по умолчанию будут выглядеть примерно так:

class testContract
{
    string StringProperty;
    int IntegerProperty;

    public testContract()
    {
        // This is your default constructor. Make sure this exists.
        // Do nothing here, or set default values for your properties
        IntegerProperty = -1;
    }

    public testContract(string StringProperty, int IntegerProperty)
    {
        // You can have another constructor that accepts parameters too.
        this.StringProperty = StringProperty;
        this.IntegerProperty = IntegerProperty;
    }
}

Когда JSON.net хочет десериализовать строку JSON в объект, он сначала инициализирует объект с помощью конструктора по умолчанию, а затем начинает заполнять его свойства.Если он не находит конструктор по умолчанию, он инициализирует объект, используя любой другой конструктор, который он может найти, но он передает null всем параметрам.

В двух словах:либо у вас есть конструктор по умолчанию для вашего целевого класса, либо ваш конструктор не по умолчанию должен иметь возможность обрабатывать все нулевые параметры.

0 голосов
/ 08 мая 2012

если вы используете [Serializable], у вас уже должен быть ctor по умолчанию, иначе он не может быть частью привязки данных. оформить заказ

  [JsonPropertyAttribute("jsonProp", Required=Required.Default)] 

на имущество у меня работает

Ньютонсофт имеет методы

Parse - будет разбирать частичные данные а также Десериализация - проанализирует все данные

если вы хотите использовать частичные данные, как в примере на их веб-сайте, используйте Parse.

Если вы хотите использовать десериализацию, вам нужно убедиться, что все ваши свойства существуют и помечены по умолчанию, как я написал выше.

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