2017-09-06 27 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); 
      } 
     }      
    } 
}