反序列化JSON文档中的重复对象

时间:2013-11-01 16:06:00

标签: 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": "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'对象视为数组?

2 个答案:

答案 0 :(得分:1)

JSON失败了。您收到的JSON格式不正确。

在服务器上发布JSON的人是否可以更改它以使其格式正确?您没有来自服务器的阵列。你实际拥有的是一个属性(在这种情况下,“TESKO”)被定义两次。

看看这个失败的C#代码......

String fail;
String fail;

你的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/>");
}

返回以下输出:

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" }

我看到的唯一选择是制作一个客户JSON反序列化器......

How to implement custom JsonConverter in JSON.NET to deserialize a List of base class objects?

答案 1 :(得分:0)

如果要将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"
        }
    }
],