исключение нулевого значения, возникающее при десериализации нулевого значения JSON.net

Привет, друзья, я пытаюсь десериализовать скрытое поле управления в объект 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 

person Bharath    schedule 07.06.2010    source источник
comment
Если вы не перепутали свой заголовок, ответ очевиден, вы даете своему коду нулевое значение, и поэтому выбрасывается NullValueException   -  person Woot4Moo    schedule 07.06.2010
comment
В предыдущих версиях, которыми я пользовался, его не бросали. Я использую JSON.net 3.5.   -  person Bharath    schedule 08.06.2010
comment
Что с этим случилось в итоге? Вы знаете, где возникла ошибка? (что это за параметр? Это как-то связано с объектом, который вы пытаетесь десериализовать, или с Json.Net?)   -  person Tao    schedule 20.06.2010


Ответы (2)


У меня было точно такое же сообщение об ошибке, когда я пытался вызвать тот же метод. Убедитесь, что у вас есть конструктор по умолчанию (конструктор без параметров) для вашего целевого класса (вашего класса 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 всем параметрам.

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

person Arash Motamedi    schedule 12.08.2010
comment
Я получал эту ошибку, используя Ninject и SignalR — разрешение пустого конструктора и установка int i = -1; исправил это для меня. - person boolean; 18.03.2012
comment
если вы используете [Serializable], у вас уже должен быть ctor по умолчанию, иначе он не может быть частью привязки данных. checkout [JsonPropertyAttribute(jsonProp, Required=Required.Default)] у меня работает - person Mickey Perlstein; 08.05.2012

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

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

на собственности работает для меня

У Newtonsoft есть методы

Parse — будет анализировать частичные данные и Deserialize — будет анализировать все данные

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

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

person Mickey Perlstein    schedule 08.05.2012