Json.NET(Newtonsoft.Json) - 两个同名的"属性"?

Ubi*_*Che 4 json properties duplicates json.net

我正在使用C#编写.NET Framework 3.5.

我试图将一些Json解析为JObject.

Json如下:

{
    "TBox": {
        "Name": "SmallBox",
        "Length": 1,
        "Width": 1,
        "Height": 2 },
    "TBox": {
        "Name": "MedBox",
        "Length": 5,
        "Width": 10,
        "Height": 10 },
    "TBox": {
        "Name": "LargeBox",
        "Length": 20,
        "Width": 20,
        "Height": 10 }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试将这个Json解析为JObject时,JObject只知道LargeBox.SmallBox和MedBox的信息丢失了.显然这是因为它将"TBox"解释为属性,并且该属性正在被覆盖.

我从一个用Delphi编码的服务接收这个Json.我正在尝试为该服务创建一个C#代理.在Delphi方面,"TBox"被理解为被返回对象的类型.然后将内部属性("名称","长度","宽度","高度")理解为常规属性.

我可以序列化和反序列化具有Name,Length,Width和Height属性的自定义"TBox"对象.没关系.

我想要做的是逐步完成所有TBox部分,以便提取以下三个Json字符串.

第一:

{
    "Name": "SmallBox",
    "Length": 1,
    "Width": 1,
    "Height": 2 }
Run Code Online (Sandbox Code Playgroud)

第二:

{
    "Name": "MedBox"
    "Length": 5,
    "Width": 10,
    "Height": 10 }
Run Code Online (Sandbox Code Playgroud)

第三:

{
    "Name": "LargeBox"
    "Length": 20,
    "Width": 20,
    "Height": 10 }
Run Code Online (Sandbox Code Playgroud)

一旦我掌握了这些字符串,我就可以将我的内容序列化和反序列化.

我发现Newtonsoft.Json非常好.如果我可以避免它,我真的不想搞乱其他框架.

任何帮助将不胜感激.

关于可以对服务器进行的更改,我的输入非常有限.

Mat*_*hen 8

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

JsonTextReader jsonReader = new JsonTextReader(reader);
jsonReader.Read();
while(jsonReader.Read())
{
    if(jsonReader.TokenType == JsonToken.StartObject)
    {
        JObject tbox = JObject.Load(jsonReader);
    }
}
Run Code Online (Sandbox Code Playgroud)

但请注意,RFC说"对象中的名称应该是唯一的",所以如果可以的话,建议更改格式.

编辑:这是一个没有重复键的替代设计:

[
    {
        "TBox": {
            "Width": 1,
            "Length": 1,
            "Name": "SmallBox",
            "Height": 2
        }
    },
    {
        "TBox": {
            "Width": 10,
            "Length": 5,
            "Name": "MedBox",
            "Height": 10
        }
    },
    {
        "TBox": {
            "Width": 20,
            "Length": 20,
            "Name": "LargeBox",
            "Height": 10
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

  • JSON中的对象是名称/值集合,此JSON滥用名称.在这个例子中,Json.NET的JObject正在完成浏览器在提供重复属性时所做的事情:使用最后一个值.最好的解决方案是将JSON更改为具有包含类型名称属性的包装器对象和值的属性,或者将类型添加为值对象上的特殊属性. (4认同)
  • 冷静 - 我正在试图帮助而不是批评你.无论如何,在这种情况下,用户是开发人员.开发人员习惯于使用名称/值集合的JSON对象.JSON主页 - http://json.org/ - 将它们定义为:名称/值集合.同样,您没有违反规范,但您正在打破用户(开发人员)的期望.如果你有充分的理由像你一样构建JSON就好了,只要注意通过做一些非标准的事情,后果可能是更多的问题,比如JSON的消费者这样的帮助. (3认同)
  • @Ubiquitous,我从未说过违反了RFC.但这是不直观的,我不一定同意这是打破它的理由.还有其他设计提供没有重复键的类型信息. (2认同)
  • 哇.我猜你给我看了那个"结束.终结." 事情.对你有益.我想json.org说Javascript*解析*JSON文本只是一种比喻.if(language =="JavaScript")parser = false?我认为JavaScript遇到重复名称时不会抛出错误不会使你的语句失效,因为JavaScript从不解析任何东西.那里重新定义的好工作.我在主人面前低头.但是,如果你想让人们不同意你,你会忘记一个重要的短语:END.最后.时间无限.*手指在耳朵*拉拉拉.... (2认同)