2017-04-17 1 views
3

j'ai essayé des approches près d'une heure différentes, mais je ne comprends pas, (JsonPath avec Newtonsoft.JSON

mon objet JSON est la suivante:

"typeOfHair": { 
    "value": [ 
     { 
      "code": "Dry Hair", 
      "values": [ 
       { 
        "value": "DryHair", 
        "language": "en" 
       }, 
       { 
        "value": "TrockenesHaar", 
        "language": "de" 
       } 
      ] 
     }, 
     { 
      "code": "Any Type of Hair", 
      "values": [ 
       { 
        "value": "AnyTypeOfHair", 
        "language": "en" 
       }, 
       { 
        "value": "JedenHaartyp", 
        "language": "de" 
       } 
      ] 
     } 
    ] 
} 

Et ma tâche est d'obtenir avec . Newtonsoft.JSON toutes les valeurs où la langue est "de" Mon approche actuelle est la suivante:

JsonObject.SelectTokens("typeOfHair.value.values[?(@.language == 'de')].value").ToList() 

quelqu'un peut me aider avec ce

?

Cordialement

Répondre

3

Vous êtes très proche. Vous devez tenir compte de l'ensemble value externe typeOfHair.value[] en utilisant l'opérateur générique JsonPATH[*]:

var values = JsonObject.SelectTokens("typeOfHair.value[*].values[?(@.language == 'de')].value") 
    // Convert from JValue to string 
    .Select(v => (string)v) 
    // Save in a list 
    .ToList(); 

Et, le résultat est:

["TrockenesHaar","JedenHaartyp"] 

Sample fiddle.

+0

Merci beaucoup – SharpNoiZy

0

Je sais que l'OP spécifié JSONPath explicitement, mais par souci d'exhaustivité ci-dessous est comment obtenir la même chose avec LINQ à JSON:

var values = jObject["typeOfHair"]["value"] 
    .SelectMany(v => v["values"]) 
    .Where(v => (string)v["language"] == "de") 
    .Select(v => (string)v["value"]) 
    .ToList(); 

Démo: https://dotnetfiddle.net/1S4sT4