Десериализованный объект имеет все значения, равные нулю - PullRequest
4 голосов
/ 21 октября 2011

Я пытаюсь десериализовать JSON в пользовательский объект, но все мои свойства имеют значение null и не уверены, что происходит.Кто-нибудь видит что-то не так?

Пример JSON

{
"Keys": [
    {
        "RegistrationKey": "asdfasdfa",
        "ValidationStatus": "Valid",
        "ValidationDescription": null,
        "Properties": [
            {
                "Key": "Guid",
                "Value": "i0asd23165323sdfs68661358"
            }
        ]
    }
 ]
}

Вот мой код, где strResponseValid - это JSON выше.

Keys myDeserializedObjValid = (Keys)JsonConvert.DeserializeObject(strResponseValid, typeof(Keys));
validationStatusValid = myDeserializedObjValid.ValidationStatus;

Вот мои классы

    public class Keys
    {
        public string RegistrationKey { get; set; }
        public string ValidationStatus { get; set; }
        public string ValidationDescription { get; set; }
        public List<Properties> PropertiesList { get; set; }
    }

    public class Properties
    {
        public string Key { get; set; }
        public string Value { get; set; }
    }

Ответы [ 5 ]

5 голосов
/ 13 января 2017

в моем случае это было из-за того, что у моего типа назначения есть внутренний (или частный) набор модификаторов для этих свойств.

public class Summary{

     public Class2 Prop1 { get; internal set; }
     public Class1 prop2 { get; set; }

}

после удаления внутреннего модификатора json.net тоже десериализует эти объекты, как на этапе сериализации

4 голосов
/ 22 октября 2011

Ваш JSON имеет внешний объект, который содержит коллекцию объектов Key. Следующий код работает (я проверял это):

    class KeyWrapper
    {
        public List<Key> Keys { get; set; }
    }

    class Key
    {
        public string RegistrationKey { get; set; }
        public string ValidationStatus { get; set; }
        public string ValidationDescription { get; set; }
        public List<Properties> Properties { get; set; }
    }

    public class Properties
    {
        public string Key { get; set; }
        public string Value { get; set; }
    }

    public void DeserializeKeys()
    {            
        const string json = @"{""Keys"": 
            [
                {
                    ""RegistrationKey"": ""asdfasdfa"",
                    ""ValidationStatus"": ""Valid"",
                    ""ValidationDescription"": null,
                    ""Properties"": [
                        {
                            ""Key"": ""Guid"",
                            ""Value"": ""i0asd23165323sdfs68661358""
                        }
                    ]
                 }
             ]
         }";

        var keysWrapper = Newtonsoft.Json.JsonConvert.DeserializeObject<KeyWrapper>(json);
 }
1 голос
/ 22 октября 2011

Вам не нужно определять PropertiesList как список в классе, просто вызовите класс PropertiesList, как показано ниже.

public class Keys
    {
        public string RegistrationKey { get; set; }
        public string ValidationStatus { get; set; }
        public string ValidationDescription { get; set; }
        public PropertiesList  PropertiesList { get; set; }
    }

    public class PropertiesList 
    {
        public string Key { get; set; }
        public string Value { get; set; }
    }

Затем попробуйте использовать следующее для десериализации:

keys myDeserializedObjValid = JsonConvert.DeserializeObject<keys>(strResponseValid);
1 голос
/ 22 октября 2011

Проблема здесь в том, что вы определяете ключи как просто класс, когда на самом деле это свойство.

public class Response
{
    public Keys Keys { get; set; }
}

public class Keys
{
    public string RegistrationKey { get; set; }
    public string ValidationStatus { get; set; }
    public string ValidationDescription { get; set; }
    public List<Properties> PropertiesList { get; set; }
}

public class Properties
{
    public string Key { get; set; }
    public string Value { get; set; }
}
0 голосов
/ 21 октября 2011

JSON.NET - это подключаемая библиотека сериализации.Свойства в ваших объектах требуют атрибутов, чтобы пометить их как включенные в структуру JSON.

public class Keys
{
    [JsonProperty(PropertyName = "RegistrationKey")]
    public string RegistrationKey { get; set; }

    [JsonProperty(PropertyName = "ValidationStatus")]
    public string ValidationStatus { get; set; }

    [JsonProperty(PropertyName = "ValidationDescription")]
    public string ValidationDescription { get; set; }

    [JsonProperty(PropertyName = "Properties")]
    public List<Properties> PropertiesList { get; set; }
}

public class Properties
{
    [JsonProperty(PropertyName = "Key")]
    public string Key { get; set; }

    [JsonProperty(PropertyName = "Value")]
    public string Value { get; set; }
}
...