2017-09-06 3 views
0

Je souhaite lire un fichier json donné et afficher la valeur du paramètre "value" uniquement pour le nom de tableau contenant la chaîne "PL_DATA_HL".Json Analyse en C# sans créer de classe

Exemple 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" 
     }, 
    ], 
} 

Je l'ai déjà essayé d'utiliser le code ci-dessous, mais semble ne fonctionne pas!

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

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

Répondre

0

Vous pouvez essayer comme ceci:

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

Revérifier la structure et votre volonté de code ressemble à:

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

Vous devez vérifier le nom de propriété de chaque élément dans la racine objet. Considérant que vous devez vérifier le nom de la propriété c'est une meilleure idée de naviguer à travers les propriétés de JObject au lieu du dynamic (vous devriez utiliser Reflection dans ce cas).

Quelque chose comme cela devrait fonctionner:

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

Je pense que d'une façon est d'utiliser Regex comme ceci:

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

Code simple:

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