在 C# 中将具有变量名称/值对的 JSON 反序列化为对象

本文关键字:JSON 反序列化 对象 变量名 | 更新日期: 2023-09-27 18:33:51

我正在使用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 派生的类:

查看我的完整类以了解 JSON 包含的内容

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

在 C# 中将具有变量名称/值对的 JSON 反序列化为对象

使用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"];