0
votes

Analyse JSON et appliquer un filtre

J'ai observablecollection appelé myjson en C # ayant 4 éléments comme suit: xxx

J'ai besoin de pouvoir appliquer une requête de filtre comme par exemple où nom = "A" et lieu = "NY" puis récupérez 2 enregistrements d'en haut.

J'ai essayé du code comme ci-dessous mais je n'ai pu analyser un enregistrement à la fois de la collection ci-dessus. Et aussi la 2e ligne semble être une erreur avec un message:

"Impossible d'accéder à la valeur de l'enfant sur newtonsoft.json.linq.jvalue." xxx

merci.


3 commentaires

Le JSON dans la collection d'échantillons ne ressemble pas à un réseau JSON correctement construit


Tandis qu'en non-réponse par JDOG Ils ont suggéré des informations dans Stackoverflow.com/questions/ 49254281 / ... peut être utile que cette question ne peut être répondue sans réelle exemple de reproductible minimal . Comme il n'y a pas de JSON réel à condition qu'il ne soit pas clair si le code manque effectivement certains .child appels ou autre chose.


Désolé mon mauvais. Ont corrigé le format. Merci.


3 Réponses :


0
votes

ici:

[
  {
    "name": "A",
    "location": "NY"
  },
  {
    "name": "B",
    "location": "NJ"
  },

  {
    "name": "A",
    "location": "NY"
  },

  {
    "name": "D",
    "location": "MA"
  }
]


0 commentaires

0
votes

Tout d'abord, corrigeons le format JSON. Si vous parlez de collecte ou de matrice, votre format JSON doit être comme celui-ci:

JArray jsonArray = JArray.Parse(jsonString);
var match = jsonArray.Where(i => i["name"].ToString() == "A" && i["location"].ToString() == "NY").ToList();


0 commentaires

0
votes

Vous savez que votre réseau JSON est incorrect, n'est-ce pas? Un tableau est dans des crochets [...] code>. Je suppose que c'est une erreur de frappe.

Mon conseil serait de séparer vos préoccupations: diviser votre problème en parties distinctes: p>

  • J'ai une chaîne dans le format JSON contenant des informations sur les personnes (?), et j'ai besoin de convertir cela en une séquence de personnes li>
  • J'ai une séquence de personnes, je n'ai besoin que de ces personnes avec un certain nom et un emplacement. Li> ul>

    Si vous faites cela, votre code sera plus facile à comprendre, plus réutilisable, plus facile à tester et plus facile à changer. Qui ne veut pas ça? P>

    Convertissez la chaîne en une séquence de personnes h3>

    pour cela, j'écris une fonction d'extension. De cette façon, cela ressemble plus à Linq. Voir Méthodes d'extension Démystifié p>

    const int name = "John Doe";
    const int location = "New York City";
    string jsonText = ...
    
    var result = jsonText.ToPersons()
        .Where(person => person.Name == name && person.Location == location);
    
    • Vous pouvez réutiliser topersons () code> pour d'autres déclarations LINQ: "Donnez-moi toutes les personnes âgées", "donnez-moi les villes où mes personnes vivent". li>
    • Il est plus facile de tester: créez simplement une gamme de personnes testées comme source pour vos déclarations LINQ LI>
    • Il est plus facile de comprendre: les personnes qui lisent vos déclarations de Linq n'ont plus besoin de déranger la conversion: ils savent que la conversion est déjà utilisée dans de nombreux autres endroits et que le logiciel de test réussit, d'où vous pouvez faire confiance. la conversion. li>
    • Il est plus facile de changer: Si vous souhaitez ajouter un code postal à vos personnes, allez-y, vos instructions LINQ ne changeront pas, uniquement TOPERSON () CODE> LI> ul> p>


0 commentaires