如何将json反序列化为C#List Object

时间:2017-01-25 00:17:39

标签: javascript c# json list json.net

我似乎遇到了一个问题,我试图将json数组反序列化为C#列表(我使用Json.NET)。问题是我收到了错误:

  

无法将当前JSON数组(例如[1,2,3])反序列化为类型   ' ProjectName.WebServices.EventWebMethods + ServiceItem'因为类型   需要一个JSON对象(例如{" name":" value"})来反序列化   正确。       要修复此错误,请将JSON更改为JSON对象(例如{" name":" value"})或将反序列化类型更改为数组或   实现集合接口的类型(例如ICollection,IList)   像可以从JSON数组反序列化的List。   JsonArrayAttribute也可以添加到类型中以强制它   从JSON数组反序列化。       路径' [0]',第1行,第2位。

这是我的json代码,它是通过使用javascript数组并使用JSON.stringify创建的:

[["6249","Locked"],["6250","Locked"],["6251","Locked"]]

这是我正在使用的C#代码:

    [Serializable]
    public class ServiceItem
    {
        long lngId{ get; set; }
        string strStatus{ get; set; }

        public ServiceItem() { }
    }

    [WebMethod(EnableSession = true)]
    public string Create(string strJSON)
    {
        //Error happens on this next line:
        List<ServiceItem> ServiceData = JsonConvert.DeserializeObject<List<ServiceItem>>(strJSON);
        return "test";
    }

如何将其反序列化到C#类中。任何帮助表示赞赏!

更新

我对我的javascript进行了更改,以便根据建议包含变量名称。还是一样的错误。这是C#变量中的JSON:

[
[\"lngId\" : \"6249\",\"strStatus\" : \"Locked\"],
[\"lngId\" : \"6250\",\"strStatus\" : \"Locked\"],
[\"lngId\" : \"6251\",\"strStatus\" : \"Locked\"]
]

花括号是否重要,如果这是问题,为什么JSON.Stringify不这样做?

更新2

想出来。我需要像这样创建每个json项目:

arrServices.push({"lngId": intServiceID, "strStatus" : "Locked"});

现在它有效。谢谢你的帮助!

1 个答案:

答案 0 :(得分:4)

您的示例JSON表示字符串数组的数组。表示由ServiceItem类表示的模式的JSON将如下所示:

[  
   {  
      "lngID":"6249",
      "strStatus":"Locked"
   },
   {  
      "lngID":"6250",
      "strStatus":"Locked"
   },
   {  
      "lngID":"6251",
      "strStatus":"Locked"
   }
]

您需要以不同的方式序列化您的数据(以便它与您的类匹配)。如果这不是一个选项,那么您将不得不手动反序列化服务器上​​的JSON:

List<ServiceItem> ServiceData =
    JArray
    .Parse(input)
    .Select(x => x.ToArray())
    .Select(x => new ServiceItem()
        {
            lngId = x[0].Value<int>(),
            strStatus = x[1].Value<String>()
        })
    .ToList();

或实施自定义JsonConverter