将JSON字符串序列化为动态对象
将JSON字符串序列化为动态对象
如果我使用术语不当,请原谅我。我想要做以下几点:
- 从URL获取JSON字符串
- 将该字符串解析为对象。
对我来说,通常这样做很容易。通常,JSON对象都是静态名称。
问题在于,子JSON对象会因个人而异。如果更改库存,它们也会发生变化。
现在,我需要将其放入一个对象中,并且可以查询它(不一定是使用linq,但可以随意提取数据)。有人有任何信息吗?我尝试创建一个动态对象(如此处所示:Deserialize JSON into C# dynamic object?),但对我没有起作用。
那个链接是否适合我的目的,我只是实现得不正确?
这是JSON的示例:http://chopapp.com/#ro46jfay
非常感谢您的帮助。
问题的原因是无法成功访问动态对象的层次结构和获取数据。尝试使用错误的方式来访问数据,导致无法正确获取到想要的结果。正确的访问方式应该是以字典的形式来访问,而不是使用错误的方式。
解决方法是使用正确的访问方式来获取数据。对于给定的 JSON 数据,可以按照以下方式访问所有的 random names 和它们的子项:
var obj = JsonConvert.DeserializeObject<dynamic>(json); foreach (var item in obj["rgDescriptions"]) { var randomName = item["RandomName"]; // 访问 randomName 的子项 foreach (var child in randomName) { // 处理子项的逻辑 } }
通过以上代码,可以成功地访问所有的 random names 和它们的子项,并进行相应的处理。
问题的出现原因:
该问题的出现是因为需要将一个JSON字符串反序列化为动态对象,但是JSON字符串中的一些属性名不符合C#的合法标识符命名规范。
解决方法:
解决方法是根据JSON字符串的结构定义一个与之对应的C#类,并使用Json.Net库中的JsonConvert.DeserializeObject方法进行反序列化操作。
具体解决步骤如下:
1. 定义与JSON字符串对应的C#类:
- RGInventory类
- AppData类
- Description类
- Action类
- MarketAction类
- Tag类
- RGDescription类
- RootObject类
2. 使用JsonConvert.DeserializeObject方法进行反序列化:
var obj = JsonConvert.DeserializeObject(json);
3. 如果需要访问随机名称和它们的子元素,可以使用LINQ表达式进行查询:
var appids = obj.rgDescriptions.Select(x => x.Value.appid).ToList();
通过定义与JSON字符串对应的C#类,并使用JsonConvert.DeserializeObject方法进行反序列化操作,可以将JSON字符串反序列化为动态对象,并可以方便地访问其中的属性和子元素。