【发布时间】:2017-10-19 23:28:46
【问题描述】:
我已经成功地使用 JToken 和 JArray 来获取特定的数据,但是我遇到了一个特定的问题。问题在于从我的节点“work_unit”中的键/值对中提取值。您可以在我的 JObject 中看到这里的节点:
JObject testString = JObject.Parse("{"
+ "'Roofing': {"
+ "'Buildings': ["
+ "{"
+ "'BuildingId': 4,"
+ "'BuildingName': 'what',"
+ "'work_unit': '{\"RoofingBuildings\":\"1\",\"WindowsBuildings\":\"\",\"GutterBuildings\":\"\",\"InsulationMasterPrice\":\"\",\"SidingBuildings\":\"\"}'"
+ "},"
+ "{"
+ "'BuildingId': 3,"
+ "'BuildingName': 'Home'"
+ "}"
+ "],"
+ "'Windows': ["
+ "{"
+ "'PerimeterDrawings': 56,"
+ "},"
+ "{"
+ "'PerimeterDrawings': 55,"
+ "}"
+ "]"
+ "},"
+ "'Window':"
+ "{"
+ "'poof': 3,"
+ "'stall': 7"
+ "},"
+ "'Products': ["
+ "'Roofing',"
+ "'Pooping',"
+ "],"
+ "'Garage': ["
+ "{"
+ "'roof': 3,"
+ "'wall': 7"
+ "},"
+ "{"
+ "'roof': 3,"
+ "'wall': 7"
+ "}"
+ "]"
+ "}");
我可以像这样得到整个 'work_unit':
JToken jt= JO.SelectToken("Roofing.Buildings[0].work_unit");
^^ jt will contain:
{{"RoofingBuildings":"1","WindowsBuildings":"","GutterBuildings":"","InsulationMasterPrice":"","SidingBuildings":""}}
如何从 RoofingBuildings 获得“1”?我尝试了几种方法,这里有一些,但它们最终都为空。
string foo1 = (string)JTNewTest.SelectToken(".RoofingBuildings");
string foo2 = (string)JO.SelectToken("Roofing.Buildings[0].work_unit[0].RoofingBuildings");
提前致谢,由于某种原因,我无法在任何其他在线示例中找到我的确切情况:/
【问题讨论】:
-
最简单的方法是创建结构相同的类,然后将 JSON 反序列化为您的类类型。然后你像往常一样使用 C# 属性和枚举、LINQ 等访问它。
-
无关:你可以使用多行字符串来去掉每一行的追加,使代码更具可读性和效率。
-
您对使用 JToken 和 JArray 有什么特别的兴趣吗?因为有更简单的方法可以解决您的反序列化问题...
-
嗨@ps2goat,我确实计划稍后将其反序列化为一个类。但现在我需要把它提取出来。
-
@javier_el_bene 以及这些方法是什么?我只是在使用它们,因为它看起来简单直接。