我似乎遇到了一个问题,我试图将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"});
现在它有效。谢谢你的帮助!
答案 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
。