C# 将具有变量名/值对的JSON反序列化为C中的对象#
我正在使用C#.NET 4.0将JSON解析为自定义对象。我正在使用JavaScriptSerializer.Deserialize将其映射到我编写的类。问题是,JSON的名称/值对不是静态的,并且根据参数isChain而变化,如此JSON片段所示(底部的更好链接): 链中可以有从_STATE_0到_STATE_25的任何条目。有没有办法存储这些数据,这样我就不必像这样编写12*26个空类:C# 将具有变量名/值对的JSON反序列化为C中的对象#,c#,.net,json,parsing,deserialization,C#,.net,Json,Parsing,Deserialization,我正在使用C#.NET 4.0将JSON解析为自定义对象。我正在使用JavaScriptSerializer.Deserialize将其映射到我编写的类。问题是,JSON的名称/值对不是静态的,并且根据参数isChain而变化,如此JSON片段所示(底部的更好链接): 链中可以有从_STATE_0到_STATE_25的任何条目。有没有办法存储这些数据,这样我就不必像这样编写12*26个空类: public StateWalkLeft0 STATE_WALK_LEFT { get; set; }
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生成的。使用和作为下面代码的示例
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);
“我不喜欢使用递归、第三方libs或反序列化到var/dynamic中。”祝你在这些范围内找到解决方案好运使用@casperOne+1你可以很容易地做到这一点,但我建议使用它。Json.NET非常缓慢且庞大,由于其复杂性,很难进行修改。@有趣的是,我不知道这一点。和。我必须试试。问题是,我的JSON包含各种其他多级条目——请查看我的编辑以澄清。Json.NET是否支持某种条件或子反序列化?如果可以,我会+1你,因为你确实在我提供的上下文中回答了这个问题。我的错误是不够清楚。Json.NET解决了您的问题。您不能像我在示例中所做的那样反序列化为类型化对象。这里有很多方法和重载。因此,您可以使用其中一个来生成例如Dictionary或内部Json.NET对象,然后可以逐节点反序列化树。如果这会有问题,请留下您的解决方案以及TypeBuilder/Reflection解决了我的问题。非常感谢。
var values = JsonConvert.DeserializeObject<Dictionary<string, ChainX>>(json);
ChainX valueWalkLeft1 = values["STATE_WALK_LEFT_1"];