【问题标题】:Deserializing a JSON with variable name/value pairs into object in C#将具有变量名称/值对的 JSON 反序列化为 C# 中的对象
【发布时间】:2012-05-11 17:46:56
【问题描述】:

我正在使用 C# .NET 4.0 将 JSON 解析为自定义对象。我正在使用 JavaScriptSerializer.Deserialize 将其映射到我编写的类。问题是,JSON 的名称/值对不是静态的,并且会根据参数 isChain 的不同而有所不同,如以下 JSON 片段所示(底部有更好的链接):

{
   "STATE_WALK_LEFT":{
      "isChain":"1",
      "x":"1"
   },
   "STATE_WALK_LEFT_0":{
      "x":"0"
   },
   "STATE_WALK_LEFT_1":{
      "x":"40"
   },
   "STATE_WALK_LEFT_2":{
      "x":"80"
   },
   "STATE_WALK_RIGHT":{
      "isChain":"0"
   },
   "STATE_RUN_LEFT":{
      "isChain":"0"
   }
}

链可以在链中包含从 _STATE_0 到 _STATE_25 的任何条目。有什么方法可以存储这些数据,这样我就不必像这样编写 12*26 的空类:

public StateWalkLeft0 STATE_WALK_LEFT { get; set; }
public StateWalkLeft0 STATE_WALK_LEFT_0 { get; set; }
public StateWalkLeft1 STATE_WALK_LEFT_1 { get; set; }
public StateWalkLeft2 STATE_WALK_LEFT_2 { get; set; }
public StateWalkLeft3 STATE_WALK_LEFT_3 { get; set; }

是否有一个库或其他方法可以用来部分解析 STATE_0、STATE_1 等字段?您能否建议一种方法来添加这些最近添加的 JSON 对?

编辑澄清: 为了了解我正在使用什么,这里是从 JSON 派生的类:

Check out my full Class to get an idea of what the JSONs contain

基本上,我只需要一种方法以某种方式将这些最近实现的链存储在此类中以进行处理。所有这些类/属性都是从这些 JSON 生成的。

【问题讨论】:

  • “我宁愿不使用递归、第 3 方库或反序列化为 var/dynamic。”祝你在这些范围内找到解决方案
  • 你可以通过Json.NET轻松做到这一点
  • @casperOne +1,但我建议在此之上使用fastJSON。 Json.NET 非常缓慢且庞大,并且由于其复杂性而难以进行修改。
  • @Erode 有趣,我不知道这个。和I see it's on NuGet。我得试试看。

标签: c# .net json parsing deserialization


【解决方案1】:

使用Newtonsoft Json.NET 并作为示例如下代码

internal struct ChainX
{
  public int x { get; set; }
  public int isChain { get; set; }
}

    static string json = 
@"{
   ""STATE_WALK_LEFT"":{
      ""isChain"":""1"",
      ""x"":""1""
   },
   ""STATE_WALK_LEFT_0"":{
      ""x"":""0""
   }, 
   ""STATE_WALK_LEFT_1"":{
      ""x"":""40""
   },
   ""STATE_WALK_LEFT_2"":{
      ""x"":""80""
   },
   ""STATE_WALK_RIGHT"":{
      ""isChain"":""0""
   },
   ""STATE_RUN_LEFT"":{
      ""isChain"":""0""
   }
}";

还有一行代码反序列化为字典:

var values = JsonConvert.DeserializeObject<Dictionary<string, ChainX>>(json);

之后,您可以通过字典键简单地访问值:

ChainX valueWalkLeft1 = values["STATE_WALK_LEFT_1"];

【讨论】:

  • 问题是,我的 JSON 包含各种其他多级条目 - 请查看我的编辑以澄清。 Json.NET 是否支持某种条件或子反序列化?如果可以的话,我会 +1 你,因为你确实在我提供的上下文中回答了这个问题。不够清楚是我的错。
  • Json.NET 解决了您的问题。您可以不像我在示例中所做的那样反序列化为类型化对象。那里有很多方法和重载。因此,您可以使用其中之一来生成 Dictionary 或内部 Json.NET 对象,然后您可以逐节点反序列化树。如果有问题,请在此处发表评论
  • 您的解决方案与 TypeBuilder/Reflection 一起解决了我的问题。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
相关资源
最近更新 更多