反序列化JSON C#时无法将类型'string'转换为List <string>

时间:2018-06-22 15:56:07

标签: c# json serialization

我正在尝试将JSON字符串反序列化为对象。

下面是JSON文本,

{
    "id":1047,
    "name":"City",
    "attribute_list":"[\"RWC\",\"HMO\",\"SJ\",\"Ensenada\"]",
    "list_type":1
}

使用的类如下,

public class TemplatesList
{
    [JsonProperty("attributes")]
    public List<Attributes> Attributes { get; set; }
}

public class Attributes
{
    [JsonProperty("id")]
    public int Id { get; set; }
    [JsonProperty("name")]
    public string Name { get; set; }
    [JsonProperty("list_type")]
    public string ListType { get; set; }
    [JsonProperty("attribute_list")]
    public List<string> ComboBoxValue { get; set; }
}

用于反序列化的代码如下,

records = JsonConvert.DeserializeObject<TemplatesList>(json);

反序列化期间,除attribute_list之外的所有属性均正确映射,在反序列化attribute_list字段期间出现以下错误“ Cannot implicitly convert type 'string' to 'System.Collections.Generic.List<string>'”。

请帮助我解决此问题。

谢谢

3 个答案:

答案 0 :(得分:2)

您需要将JSON更改为以下删除转义符号的符号:

{
  "id":1047,
  "name":"City",
  "attribute_list":["RWC","HMO","SJ","Ensenada"],
  "list_type":1
}

或为您的类型创建JsonConverter,它将处理您的attribute_list到字符串集合

答案 1 :(得分:1)

尝试这样的事情:

    public class Attributes
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string ListType { get; set; }
        private List<string> _ComboBoxValue { get;set;}
        public string ComboBoxValue
        {
            get
            {
                return "[\"" + string.Join("\",\"", _ComboBoxValue) + "\"]";
            }
            set
            {
                _ComboBoxValue = value.Split(new char[] { '[', ',', ']' }, StringSplitOptions.RemoveEmptyEntries).ToList();
            }
        }
    }

答案 2 :(得分:1)

您可以使用Newtonsoft.Json

var files = JObject.Parse(YourJSONHere);
var recList = files.SelectTokens("$").ToList();
foreach (JObject item in recList)
{
   foreach (JProperty prop in item.Children())
     {
            string key = prop.Name.ToString();
            string value = prop.Value.ToString();
            // or do whatever 
     }
}