C# 反序列化JSON文档中的重复对象
在反序列化同名对象时遇到问题。它们可以重复,但是它们不是以数组的形式格式化的,所以我使用的Newtonsoft.Json库不允许我从这些对象创建数组。下面是我面临的JSON示例:C# 反序列化JSON文档中的重复对象,c#,.net,json,deserialization,C#,.net,Json,Deserialization,在反序列化同名对象时遇到问题。它们可以重复,但是它们不是以数组的形式格式化的,所以我使用的Newtonsoft.Json库不允许我从这些对象创建数组。下面是我面临的JSON示例: { "TESKO": { "Id": "19337", "Name": "PR3337", "Status": "Sold", "Code": "GPPD", "LastUpdatedDate": "2013-08-16", "internalId": "19337" }
{
"TESKO": {
"Id": "19337",
"Name": "PR3337",
"Status": "Sold",
"Code": "GPPD",
"LastUpdatedDate": "2013-08-16",
"internalId": "19337"
},
"TESKO": {
"Id": "19337",
"Name": "PR-6477",
"Status": "Sold",
"Code": "GPPD",
"LastUpdatedDate": "2013-08-16",
"internalId": "19337"
},
"BRITISHTOBACCO": {
"Id": "19337",
"Name": "PR-4634",
"Status": "Sold",
"Code": "GPPD",
"LastUpdatedDate": "2013-08-16",
"internalId": "19337"
},
"DDI": {
"Id": "19337",
"Name": "PR-6477",
"Status": "Sold",
"Code": "GPPD",
"LastUpdatedDate": "2013-08-16",
"internalId": "19FF337"
}}
upd:下面是我将JSON字符串反序列化到的类:
// Generated by Xamasoft JSON Class Generator
// http://www.xamasoft.com/json-class-generator
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace ConsoleApplication2
{
public class MyResponse
{
[JsonProperty("TESKO")]
public TESKO[] TESKO { get; set; }
[JsonProperty("BRITISHTOBACCO")]
public BRITISHTOBACCO[] BRITISHTOBACCO { get; set; }
[JsonProperty("DDI")]
public DDI[] DDI { get; set; }
}
public class TESKO : CommonResult
{ }
public class BRITISHTOBACCO : CommonResult
{ }
public class DDI : CommonResult
{ }
public class TP : CommonResult
{ }
public class CommonResult
{
[JsonProperty("Id")]
public string Id { get; set; }
[JsonProperty("Name")]
public string Name { get; set; }
[JsonProperty("Status")]
public string Status { get; set; }
[JsonProperty("Code")]
public string Code { get; set; }
[JsonProperty("LastUpdatedDate")]
public string LastUpdatedDate { get; set; }
[JsonProperty("internalId")]
public string InternalId { get; set; }
}
}
如何使反序列化程序将“TESKO”对象视为数组?JSON失败。您接收的JSON格式不正确 难道在服务器上发出JSON的人无法更改它,使其格式正确吗?您没有来自服务器的阵列。您实际拥有的是一个属性(在本例中为“TESKO”)被定义了两次 看看这个失败的C代码 您的JSON具有完全相同的功能。就像他们试图定义变量TESKO两次一样 看看这个代码
var js = "{\"TESKO\": {\"Id\": \"19337\",\"Name\": \"PR3337\",\"Status\": \"Sold\",\"Code\": \"GPPD\",\"LastUpdatedDate\": \"2013-08-16\",\"internalId\": \"19337\"},\"TESKO\": {\"Id\": \"19337\",\"Name\": \"PR-6477\",\"Status\": \"Sold\",\"Code\": \"GPPD\",\"LastUpdatedDate\": \"2013-08-16\",\"internalId\": \"19337\"},\"BRITISHTOBACCO\": {\"Id\": \"19337\",\"Name\": \"PR-4634\",\"Status\": \"Sold\",\"Code\": \"GPPD\",\"LastUpdatedDate\": \"2013-08-16\",\"internalId\": \"19337\"},\"DDI\": {\"Id\": \"19337\",\"Name\": \"PR-6477\",\"Status\": \"Sold\",\"Code\": \"GPPD\",\"LastUpdatedDate\": \"2013-08-16\",\"internalId\": \"19FF337\"}}";
var items = JObject.Parse(js);
foreach (var i in items)
{
Response.Write("Key: " + i.Key + "<br/>Value: " + i.Value + "<br/><br/>");
}
我看到的唯一选择是制作一个客户JSON反序列化程序
如果您想将TESKO反序列化为一个数组,那么json应该如下所示:
"TESKOS": [
{
"TESKO": {
"Id": "19337",
"Name": "PR-6477",
"Status": "Sold",
"Code": "GPPD",
"LastUpdatedDate": "2013-08-16",
"internalId": "19337"
}
},
{
"TESKO": {
"Id": "19337",
"Name": "PR-6477",
"Status": "Sold",
"Code": "GPPD",
"LastUpdatedDate": "2013-08-16",
"internalId": "19337"
}
}
],
反序列化JSON字符串时会出现问题。我收到一个错误“无法将属性TESKO添加到Newtonsoft.Json.Linq.JObject。对象上已存在同名属性。”仍然收到一个错误“无法将当前Json对象反序列化到类型“Test.TESKO[]”中,因为该类型需要一个Json数组(例如[1,2,3])才能正确反序列化。”这意味着JSON输入字符串与数组类型不匹配,它的格式不正确。请更新原始帖子以包含您试图反序列化的C#数据类型。请查看更新。服务器上的某些内容必须更改,或者您可能必须编写自己的反序列化程序。是的!但那是我的问题!我无法影响JSON字符串的构建方式。这是我能从web服务获得的唯一格式,我必须处理它
Key: TESKO
Value: { "Id": "19337", "Name": "PR-6477", "Status": "Sold", "Code": "GPPD", "LastUpdatedDate": "2013-08-16", "internalId": "19337" }
Key: BRITISHTOBACCO
Value: { "Id": "19337", "Name": "PR-4634", "Status": "Sold", "Code": "GPPD", "LastUpdatedDate": "2013-08-16", "internalId": "19337" }
Key: DDI
Value: { "Id": "19337", "Name": "PR-6477", "Status": "Sold", "Code": "GPPD", "LastUpdatedDate": "2013-08-16", "internalId": "19FF337" }
"TESKOS": [
{
"TESKO": {
"Id": "19337",
"Name": "PR-6477",
"Status": "Sold",
"Code": "GPPD",
"LastUpdatedDate": "2013-08-16",
"internalId": "19337"
}
},
{
"TESKO": {
"Id": "19337",
"Name": "PR-6477",
"Status": "Sold",
"Code": "GPPD",
"LastUpdatedDate": "2013-08-16",
"internalId": "19337"
}
}
],