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

标签 c# .net json parsing deserialization

我正在使用 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 生成的。

最佳答案

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

关于c# - 在 C# 中将具有变量名称/值对的 JSON 反序列化为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10556205/

相关文章:

c# - WPF ListView->GridView->StackPanel

c# - 如何以编程方式选择列表框中的项目?

c# - 在 linq-to-sql 查询中将字符串转换为 int : how to deal with values which cannot be converted?

java - GSON 不返回键名,仅返回值(Java)

java - Android kotlin - 使用 loopj AsyncHttpClient 接收多维数组/json

c# - 检查 'T'是否继承或实现了一个类/接口(interface)

c# - "dynamic"用于匿名委托(delegate)?

.net - 我可以向 ML.NET 添加规则吗?

c# - 在 .Net 中锁定 - 是引用锁定还是对象锁定?

json - 从 Postgres NOSQL/json 数据中搜索和选择