【问题标题】:Not getting result when deserializing json using DataContractJsonSerializer使用 DataContractJsonSerializer 反序列化 json 时没有得到结果
【发布时间】:2019-08-05 14:15:22
【问题描述】:

我有以下 json:

{
  "Australia": {
    "count": 2,
    "records": {
      "File1.ppt": {
        "id": "123456789"
      },
      "File2.doc": {
        "id": "987654321"
      }
    }
  },
  "PDFs.zip": {
    "count": 0,
    "records": {}
  },
  "Peru": {
    "count": 2,
    "records": {
      "File3.PPT": {
        "id": "897456123"
      },
      "File4.PPT": {
        "id": "123546789"
      }
    }
  },
  "total count": 4
}

为了反序列化上面的 json,我定义了一些类,这样我就可以在将我的 json 反序列化为对象时使用这些类,下面是这些类:

namespace GEO_Batch_Creation
{
    [DataContract]
    class BhpIdJson
    {
        [DataMember(Name = "objects")]
        public Dictionary<string, Country[]> Countries { get; set; }

        [DataMember(Name = "total count")]
        public int TotalCount { get; set; }
    }

    [DataContract]
    class Country
    {
        [DataMember(Name = "count")]
        public int Count { get; set; }

        [DataMember(Name = "records")]
        public Dictionary<string, Record> Records { get; set; }
    }

    [DataContract]
    class Record
    {
        [DataMember(Name = "filename")]
        public string FileName { get; set; }

        [DataMember(Name = "id")]
        public Dictionary<string, string> BhpId { get; set; }
    }
}

但是当我使用以下代码反序列化 json 时,我得到的只是总数。

    using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
    {
        // Deserialization from JSON  
        DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(BhpIdJson));
        BhpIdJson bsObj2 = (BhpIdJson)deserializer.ReadObject(ms);                
    }

请建议我在哪里做错了。

【问题讨论】:

  • 我建议使用 JSON.NET 和 app.quicktype.io?share=4Jf5zFTxMJF2iOu62REc
  • 你的json没有objects属性
  • 这个 json 是从哪里生成的,因为它与你的 c# 类不匹配
  • 如果 C# 类有任何问题,请建议我,我会修复它。实际上有人建议对于根元素你可以这样写。
  • 你看我建议的链接了吗?

标签: c# json json-deserialization


【解决方案1】:

我认为这个 JSON 格式不正确。我不知道你是从某个地方得到这个还是自己做的,但如果是最后一个,我建议你改变结构。 即使在 C# 中,您也无法真正创建一个类,该类在同一个 List 或 Array 等中具有对象和对象的计数。 根据您的班级,您的 JSON 应如下所示:

{
  "objects": [
    {
      "name": "Australia",
      "count": 2,
      "records": [
        {
          "fileName": "File1.ppt",
          "id": "123456789"
        },
        {
          "fileName": "File2.doc",
          "id": "987654321"
        }
      ]
    }
  ],
  "total count": 4
}

如您所见,您必须在 Country 类中添加 Name 或其他内容。我希望它有所帮助。

编辑: 您可以像我上面提到的那样创建一个列表,但我认为这不是一个好习惯。

【讨论】:

  • 感谢您的评论,但我从我的客户那里得到了这个 json,所以我没有选择更改 json 的选项。但是我可以选择更改我的反序列化代码。
  • 如果你从你的客户端得到这个,这意味着客户端并不真正理解 JSON 消息的格式。问题是您必须制作自己的反序列化器,因为每个反序列化器(如 Newtonsoft)都会抛出异常。
  • 是的,你是对的,我错了。但是它并不是真正可用的,因为实体的“类名”是国家/地区的名称,第三方反序列化程序无法为您将其反序列化为 C# 对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多