【问题标题】:Deserialize duplicate objects in JSON document反序列化 JSON 文档中的重复对象
【发布时间】:2013-11-01 16:06:00
【问题描述】:

在反序列化同名对象时遇到问题。它们可以重复,但是它们没有以数组形式格式化,因此我使用的 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”对象视为数组?

【问题讨论】:

    标签: c# .net json deserialization


    【解决方案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?

    【讨论】:

    • 反序列化JSON字符串时出现问题。我收到错误消息“无法将属性 TESKO 添加到 Newtonsoft.Json.Linq.JObject。对象上已存在同名的属性。”
    • 仍然收到错误“无法将当前 JSON 对象反序列化为类型 'Test.TESKO[]',因为该类型需要 JSON 数组(例如 [1,2,3])才能正确反序列化。”这意味着 JSON 输入字符串与数组类型不匹配,它的格式不正确
    • 更新原始帖子以包含您尝试反序列化的 C# 数据类型。
    • 查看更新。必须在服务器上更改某些内容,或者您​​可能必须编写自己的反序列化器。
    【解决方案2】:

    如果你想将 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 字符串的构建方式。这是我可以从 Web 服务获得的唯一格式,我必须处理它
    猜你喜欢
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    相关资源
    最近更新 更多