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