将复杂的Json转换为对象

时间:2019-08-06 09:05:40

标签: c# json json.net

我有以下JSON响应:

{
"data": [
{
  "ac_conditions": "[{\"ac_condition_group_id\":156570,\"ac_condition_group_name\":\"\u0413\u0440\u0443\u043f\u043f\u0430 \u0443\u0441\u043b\u043e\u0432\u0438\u0439  1\",\"id\":311790,\"ac_parameter\":\"utm_source\",\"ac_operator\":\"=\",\"value\":\"google_rem\",\"is_negative\":false},{\"ac_condition_group_id\":156570,\"ac_condition_group_name\":\"\u0413\u0440\u0443\u043f\u043f\u0430 \u0443\u0441\u043b\u043e\u0432\u0438\u0439  1\",\"id\":275094,\"ac_parameter\":\"utm_source\",\"ac_operator\":\"=\",\"value\":\"yandex_retargeting\",\"is_negative\":false}]",
  "is_dt_enabled": true,
  "ac_id": 162866,
  "site_blocks": "[{\"id\":324164,\"name\":\"\u041d\u043e\u043c\u0435\u0440 1 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435\",\"phone_type\":\"virtual\",\"numb\":\"74950238629\",\"forward_numb\":null,\"is_dt_enabled\":true,\"dt_number_pool_numbers\":[\"74951828912\",\"74950324045\",\"74950324046\",\"74950324043\",\"74950324037\",\"74951828907\",\"74950324048\",\"74950324049\",\"74951523589\",\"74953239984\"]}]"
}
],
"success": true
}

我创建了一个类来取消实现它

    public class Condition 
    {
        public bool success;
        public List<Data> data;
        public class Data 
        {
            public string ac_conditions;                
            public int ac_id; 
            public bool is_dt_enabled;
            public string site_blocks;

        };
    }

一切正常。我需要的是将元素ac_conditions和site_blocks取消实现。我创建了一个新类,但出现异常(System.String无法转换为List)

        public class Condition 
    {
        public bool success;
        public List<Data> data;
        public class Data 
        {
            public List<ConditionCamp> ac_conditions;                
            public int ac_id;
            public bool is_dt_enabled;
            public List<SiteBlock> site_blocks;
            public class ConditionCamp
            {
                public int ac_condition_group_id;
                public string ac_condition_group_name;
                public int id;
                public string ac_parameter;
                public string ac_operator;
                public string value;
                public bool is_negative;
            }
            public class SiteBlock
            {
                public int id;
                public string name;
                public string phone_type;
                public string numb; 
                public string forward_numb;
                public bool is_dt_enabled;
                public string dt_number_pool_numbers;
            }
        };
    }

我在代码中使用此行反序列化JSON响应

JsonConvert.DeserializeObject<Models.Condition>(string_Condition);

1 个答案:

答案 0 :(得分:1)

您的JSON属性“ site_blocks”是一个包含序列化JSON数据的字符串值。因此,您需要第二步解包/反序列化数据。如果您可以更改响应的生成方式,则可以在那里进行修复(在site_blocks中返回JSON,并且不包含字符串)

例如(使用Json.net,第二次解析运行的结果存储在site_blocks_parsed中)

public class Condition 
{
    public bool success;
    public List<Data> data;
    public class Data 
    {
        public string ac_conditions;                
        public int ac_id; 
        public bool is_dt_enabled;
        public string site_blocks;
        public List<SiteBlock> site_blocks_parsed;
        public class ConditionCamp
        {
            public int ac_condition_group_id;
            public string ac_condition_group_name;
            public int id;
            public string ac_parameter;
            public string ac_operator;
            public string value;
            public bool is_negative;
        }
        public class SiteBlock
        {
            public int id;
            public string name;
            public string phone_type;
            public string numb; 
            public string forward_numb;
            public bool is_dt_enabled;
            public string dt_number_pool_numbers;
        }
    };
}

...

var condition = JsonConvert.DeserializeObject<Condition>(jsonString);
foreach (var data in condition.data) {
  data.site_blocks_parsed = JsonConvert.DeserializeObject<List<SiteBlock>>(data.site_blocks);
}
相关问题