2017-09-06 101 views
0

我想要读取给定的json并仅显示包含字符串"PL_DATA_HL"的Array名称的参数"value"的值。Json在C#中解析而不创建类

样品JSON:

{ 
    "PL_DATA_HL_XYZ": [ 
     { 
      "name": "$.properties.start", 
      "value": "new password" 
     }, 
     { 
      "name": "$.properties.end", 
      "value": "2017-04-20T00:30:00Z" 
     }, 
    ], 
    "PL_DATA_IL_HGF": [ 
     { 
      "name": "$.properties.start", 
      "value": "2017-05-21T01:00:00Z" 
     }, 
     { 
      "name": "$.properties.end", 
      "value": "2017-05-21T01:00:00Z" 
     }, 
    ], 
    "PL_DATA_HL_ABC": [ 
     { 
      "name": "$.properties.start", 
      "value": "new password" 
     }, 
     { 
      "name": "$.properties.end", 
      "value": "2017-04-20T00:30:00Z" 
     }, 
    ], 
} 

我已经尝试使用下面的代码,但似乎不工作!

dynamic jsonObj = Newtonsoft.Json.JsonConvert.DeserializeObject(json); 

foreach (var set in jsonObj) 
{ 
    Console.WriteLine(set.value); 
} 

回答

0

你可以尝试这样的:

foreach (var jsonArr in jsonObj) 
     { 
      if (jsonArr.Key.StartsWith("PL_DATA_HL")) 
      { 
       foreach (var elem in jsonObj[jsonArr.Key]) 
       { 
        Console.WriteLine(elem["value"]); 
       } 
      } 
     } 
1

重新检查的结构和您的代码将是这样的:

dynamic jsonObj = JsonConvert.DeserializeObject(json); 

foreach (var set in jsonObj) 
{ 
    if(Convert.ToString(set.Name).Contains("PL_DATA_HL")) 
     foreach (var sub in set.Value) 
     { 
      Console.WriteLine(sub.value); 
     } 
} 
1

你必须在根检查每个元素的属性名目的。考虑到您必须检查属性名称,最好导航JObject而不是dynamic(在这种情况下,您应该使用Reflection)属性。

像这样的东西应该工作:

JObject jsonObj = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(json); 
foreach (var property in jsonObj.Properties()) 
{ 
    if (property.Name.StartsWith("PL_DATA_HL")) 
    { 
     Console.WriteLine("Property: " + property.Name); 

     JArray array = (JArray)property.Value; 

     foreach (JObject values in array) 
     { 
      Console.WriteLine("Name: " + values.GetValue("name")); 
      Console.WriteLine("Value: " + values.GetValue("value")); 
     } 

     Console.WriteLine("---------------------------------"); 
    } 
} 

Console.ReadKey(); 
0

我觉得一个方法是使用Regex这样的:

var values = 
    Regex.Matches(json, @"""PL_DATA_HL[^]]+]") 
     .OfType<Match>() 
     .SelectMany(c=> Regex.Matches(c.ToString(), @"(?<=""value"")\s*:\s*""(?<value>[^""]+)""") 
     .OfType<Match>().Select(m=> m.Groups["value"].ToString())) 
     .ToList(); 

[ C# Demo ]

0

简单代码:

string json = string.Empty; 
using (StreamReader r = new StreamReader("Sample.json")) 
{ 
    json = r.ReadToEnd(); 
} 
dynamic jsonObj = Newtonsoft.Json.JsonConvert.DeserializeObject(json); 

foreach (var set in jsonObj) 
{ 
    if ((set).Name.Contains("PL_DATA_HL")) 
    { 
     object value = (set).Value; 
     dynamic jsonValues = Newtonsoft.Json.JsonConvert.DeserializeObject(value.ToString()); 
     Console.WriteLine("Values for " + (set).Name); 
     foreach (var jsonValue in jsonValues) 
     { 
      var items = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonValue.ToString()); 
      foreach (var item in items) 
      { 
       if((item).Name == "value") 
        Console.WriteLine((item).Value); 
      } 
     }      
    } 
}