Ajay_Saini Ответов: 1

Проблема десериализации Newtonsoft json


Привет,

Не могли бы вы помочь, как десериализовать нижеприведенную строку Json?

string JsonString = @"{'api_res_key':'TestKey','res_status':'200','res_data':{'32':{ 'state_id':'32','state_name':'ANDAMAN & NICOBAR'},'1':{ 'state_id':'1','state_name':'ANDHRA PRADESH'},'3':{ 'state_id':'3','state_name':'ARUNACHAL PRADESH'}}}";
            JObject person = JObject.Parse(JsonString);

What I have tried:

I had tried to deserialise in following way but it gives me exception...


<pre>    public class RootObject
    {
        public string api_res_key { get; set; }
        public string res_status { get; set; }
        public ResData[] res_data { get; set; }
    }

    public class ResData
    {
        public string state_id { get; set; }
        public string state_name { get; set; }
    }


var Data = JsonConvert.DeserializeObject<RootObject[]>(JsonString);

1 Ответов

Рейтинг:
7

Graeme_Grant

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

Когда вы смотрите на объект JSON 'res_data', есть 3 набора пар ключей и значений:

'32':{ 'state_id':'32','state_name':'ANDAMAN & NICOBAR'},
'1' :{ 'state_id':'1','state_name':'ANDHRA PRADESH'},
'3' :{ 'state_id':'3','state_name':'ARUNACHAL PRADESH'}


Поэтому, чтобы исправить это, вам нужно сделать что-то вроде:
public class State
{
    [JsonProperty("state_id")]
    public string StateId { get; set; }

    [JsonProperty("state_name")]
    public string StateName { get; set; }
}

public class RootObject
{
    [JsonProperty("api_res_key")]
    public string ApiResKey { get; set; }

    [JsonProperty("res_status")]
    public string ResStatus { get; set; }

    [JsonProperty("res_data")]
    public Dictionary<int, State> ResData { get; set; }
}

Затем вы можете десериализовать JSON:
var data = JsonHelper.ToClass<RootObject>(JsonString);

А вот и вспомогательный класс из этой статьи: Работа с JSON в C# и VB[^]
public static class JsonHelper
{
    public static string FromClass<T>(T data, bool isEmptyToNull = false,
                                        JsonSerializerSettings jsonSettings = null)
    {
        string response = string.Empty;

        if (!EqualityComparer<T>.Default.Equals(data, default(T)))
            response = JsonConvert.SerializeObject(data, jsonSettings);

        return isEmptyToNull ? (response == "{}" ? "null" : response) : response;
    }

    public static T ToClass<T>(string data, JsonSerializerSettings jsonSettings = null)
    {
        var response = default(T);

        if (!string.IsNullOrEmpty(data))
            response = jsonSettings == null
                ? JsonConvert.DeserializeObject<T>(data)
                : JsonConvert.DeserializeObject<T>(data, jsonSettings);

        return response;
    }
}


Ajay_Saini

Большое вам спасибо ... все работает так, как и ожидалось. Что делать, если res_data имеет тип массива.

строка JsonString = @"{'api_res_key':'HASH777VALID','res_status':'200','res_data':[{ 'state_id':'32','state_name':'ANDAMAN & NICOBAR'},{ 'state_id':'1','state_name':'ANDHRA PRADESH'},{ 'state_id':'3','state_name':'ARUNACHAL PRADESH'}]}";

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