当前位置: 首页 > 面试题库 >

Json.NET(Newtonsoft.Json)-两个具有相同名称的“属性”?

曾皓
2023-03-14
问题内容

我正在用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 }
}

当我尝试将此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 }

第二:

{
    "Name": "MedBox"
    "Length": 5,
    "Width": 10,
    "Height": 10 }

第三:

{
    "Name": "LargeBox"
    "Length": 20,
    "Width": 20,
    "Height": 10 }

一旦有了这些字符串,就可以序列化和反序列化到我内心的内容。

我发现Newtonsoft.Json很好。如果可以避免的话,我真的不想和其他框架搞混。

任何帮助将不胜感激。

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


问题答案:
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);
    }
}

但是,请注意,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
        }
    }
]


 类似资料:
  • 问题内容: 我正在尝试使用RSA 7.5和Websphere 7服务器开发IBM JAX_WS Web服务。因为我是一个初学者,所以我遵循Java类优先方法,即首先创建Java类,然后生成WSDL文件。 当我尝试创建wsdl文件时,出现异常: java.security.PrivilegedActionException:com.sun.xml.internal.bind.v2.runtime.I

  • 假设您有2个包,并且有名为-Test的公共类。 第一个包。测试 第二包测试 它们中的每一个都有实例变量-x。 在第一种情况下-int x=2; 在第二种情况下-int x=3; 我想导入FirstPackage。在第二个包内测试。测试并打印值为2的x。 我的代码: 但是输出是3。如何打印?

  • 我有一个采访问题-C#,是否可以在一个类中实现,从接口继承有两个具有相同名称和相同签名的方法?

  • 我改变了切入点的顺序,它总是排在第二位。关于如何解决这个问题有什么想法吗? 更新 一旦我发布了这个问题,我就有了一个想法。我这样更改了切入点: 现在异常消失了,但仍然有一个小问题(我想这个问题更容易解决):因为ArrayList实现了可序列化,所以至少在我使用ArrayList的测试用例中,两个切入点都被执行了。 我将对此进行研究,并发布我的发现,但也感谢您的帮助;) 我将代码改为只使用一个切入点

  • 问题内容: 我正在使用JSON.NET,我想从XML转换为JSON。 我正在使用JsonConvert.SerializeXNode(node),我注意到我的json对象具有在其名称前面带有@的属性: 因此,例如:如果我有: JSON对象是: 为什么在JSON中插入“ @”,有什么方法可以避免插入“ @”字符? 问题答案: 我认为这就是json.net关于@符号的工作方式。您始终可以在json字符

  • 问题内容: 表1包含列:entry_id user_id …表2包含列:entry_id user_id … user_id条目并不总是相同的,因此我想将它们都提取出来,以便以后可以在脚本中对它们进行比较 我想提取t1.user_id和t2.user_id …问题是结果数组只有user_id 谢谢你 问题答案: 使用关键字: