2017-05-19 36 views
0

我已经成功地使用JToken和JArray来抓取特定的数据,但我遇到了一个特殊的问题。问题在于从节点'work_unit'中的键/值对中提取值。你可以在这里看到的节点在我JObject:如何从此JSON节点提取这些键/值对?

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":""}} 

我如何得到“1” RoofingBuildings?我已经尝试了几种方法,下面是一些方法,但它们最终只能为空。

string foo1 = (string)JTNewTest.SelectToken(".RoofingBuildings"); 
string foo2 = (string)JO.SelectToken("Roofing.Buildings[0].work_unit[0].RoofingBuildings"); 

在此先感谢,我找不到我的确切情况,由于某种原因,其他任何在线的例子:/

+1

最简单的方法是创建结构相同的类,然后将JSON反序列化为类类型。然后你就像正常使用C#属性和枚举,LINQ等一样访问它。 – ps2goat

+1

无关联: 可以使用多行字符串来摆脱每行的附加操作,使代码更具可读性和高效性。 –

+0

你有没有在使用JToken和JArray时特别有趣?因为有更简单的方法来解决你的反序列化问题... –

回答

0

你可以得到它这个样子,我假定work_unit应该被拆分把它变成它自己的属性,而不是一个字符串..希望我在这个假设中是正确的。为了便于阅读,也制作了多行字符串。

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 
      } 
     ] 
    }"); 

    var roofingBuildings = testString["Roofing"]["Buildings"][0]["work_unit"]["RoofingBuildings"]; 

    Console.WriteLine("RoofingBuildings: {0}", roofingBuildings); 
+0

嘿奥斯汀,这正是我的想法,当我摆脱单引号时之前和之后的'{''}'符号,以便它不是一个字符串,我认为这是一个字符串的目的,我可以访问它,但我不知道,我会让第三方知道改变这一点。谢谢 – JoshuaRG1993

+0

@ JoshuaRG1993,我想你可以访问它,但是你必须将work_unit解析为一个'JObject',然后获取信息。然而,看起来很奇怪它是JSON中的字符串表示。 JSON .. heh –

+0

是的,也许这是第三方犯的一个错误,是的,那也是我的想法我可以将该字符串序列化为一个JObject并再次通过它,但我也认为它是愚蠢的。我发邮件让他们知道变化将不胜感激。再次感谢您的回应。 – JoshuaRG1993