Json.NET (Newtonsoft.Json) - Deux "propriétés" avec le même nom?
Je code en C# pour le .NET Framework 3.5.
Je suis en train d'analyser certains Json pour un JObject.
Le Json est comme suit:
{
"TBox": {
"Name": "SmallBox",
"Length": 1,
"Width": 1,
"Height": 2 },
"TBox": {
"Name": "MedBox",
"Length": 5,
"Width": 10,
"Height": 10 },
"TBox": {
"Name": "LargeBox",
"Length": 20,
"Width": 20,
"Height": 10 }
}
Quand j'essaie d'analyser ce Json pour un JObject, le JObject ne sait que sur LargeBox. Les informations pour SmallBox et MedBox est perdu. Évidemment, ce n'est parce que c'est l'interprétation de "TBox" comme une propriété, et la propriété est d'être écrasées.
Je reçois ce Json à partir d'un service qui est codé en Delphi. Je suis en train de créer un C# proxy pour ce service. Sur le Delphi côté des choses, le "TBox" est considéré comme le type de l'objet retourné. L'intérieur des propriétés ("Nom", "Longueur", "Largeur", "Hauteur") sont alors comprises comme des propriétés.
Je peut sérialiser et désérialiser une "TBox' objet qui a le Nom, la Longueur, la Largeur et la Hauteur. C'est très bien.
Ce que je veux faire est de parcourir toutes les TBox les sections de manière à extraire les trois chaînes Json.
Première:
{
"Name": "SmallBox",
"Length": 1,
"Width": 1,
"Height": 2 }
Deuxième:
{
"Name": "MedBox"
"Length": 5,
"Width": 10,
"Height": 10 }
Troisième:
{
"Name": "LargeBox"
"Length": 20,
"Width": 20,
"Height": 10 }
Une fois que j'ai ces chaînes, je peut sérialiser et désérialiser à mon cœur de contenu.
Je suis la recherche Newtonsoft.Json pour être très bon. Je ne veux vraiment pas aller faire du tort à d'autres cadres si je peux l'éviter.
Toute aide serait grandement appréciée.
J'ai très limitée d'entrée à des modifications qui peuvent être faites sur le serveur.
OriginalL'auteur Ubiquitous Che | 2010-10-06
Vous devez vous connecter pour publier un commentaire.
Cependant, notez que la RFC dit, "Les noms à l'intérieur d'un objet DOIT être unique" si vous le pouvez, vous conseillons le format a changé.
EDIT: Voici une autre conception qui n'a pas de doubles de clés:
Dans ce cas, je voudrais interpréter le DEVRAIENT, en direction de JSON-parser-développeurs qu'ils ne devraient pas jeter une erreur lorsqu'ils rencontrent des noms en double. Cependant, depuis le JS en JSON est l'acronyme de "JavaScript" et JavaScript structures de données NE peut pas avoir de doublons de noms, il me semble clair que votre Delphi gars sont à la violation de l'esprit, sinon la lettre, de la spécification. Le Newtonsoft comportement est tout à fait correct, parce que c'est la même chose qu'un parser JavaScript ferait.
Un objet en JSON est un nom/valeur de la collection et JSON est frauduleusement le nom. Json.NET's JObject dans cet exemple est en train de faire exactement ce qu'est un navigateur ferait lorsqu'il est fourni avec double propriétés: utilise la dernière valeur. La meilleure solution est de changer le JSON à avoir soit un objet wrapper avec une propriété pour le nom du type et de la propriété de la valeur ou ajouter le type spécial de propriété sur la valeur de l'objet.
Calme - je suis en train de donner mon avis en essayant de l'aider, de ne pas vous critiquer. De toute façon, un utilisateur dans ce cas est le développeur. Les développeurs sont à utiliser pour travailler avec des objets JSON que sont nom/valeur des collections. Le JSON page d'accueil - json.org - définit comme juste que: un nom/valeur de la collection. Encore une fois, vous n'êtes pas casser la spec, mais vous êtes en rupture de l'utilisateur (développeur) des attentes. Si vous avez une bonne raison de la structure JSON comme vous avez alors c'est très bien, juste être conscient qu'en faisant quelque chose de non-standard, la conséquence pourrait être plus de questions pour obtenir de l'aide comme celle-ci par les consommateurs au format JSON.
Wow. Je suppose que vous m'avez montré avec "FIN. FINAL." chose. Bon pour vous. Je suppose que json.org dire que Javascript analyse JSON texte est juste une figure de style. si la langue (=="JavaScript") parser = false? Je suppose que JavaScript ne pas jeter les erreurs lors de la duplication de noms sont rencontrés ne pas invalider votre déclaration au sujet des analyseurs, parce que JavaScript traite jamais quoi que ce soit. Bon travail de redéfinition. Je m'incline devant le maître. Cependant, si vous souhaitez arrêter les gens à être en désaccord avec vous, vous avez oublié une phrase importante: FIN. FINAL. FOIS L'INFINI. les doigts dans les oreilles Lalala....
OriginalL'auteur Matthew Flaschen
Si je ne me trompe pas, la réponse correcte à cette question est que votre entrée n'est pas réellement JSON. Donc, non, l'obtention d'un JSON analyseur de parser, il ne va pas probablement travailler.
Peut-être que vous n'avez pas de contrôle sur la source de l'entrée, alors j'aimerais utiliser une Regex ou quelque chose de pré-filtre de la chaîne. Le transformer en quelque chose comme:
Et de le traiter comme le tableau qui il est.
S'avère qu'ils sont techniquement encore envoyer de Json valide. Voir mon deuxième commentaire de Matthieu ci-dessus. C'est gênant sur ma fin, mais je peux gérer ça maintenant.
Vous vous trompez - il est correct JSON.
Non, c'est vraiment pas correct JSON. Vous êtes d'une mauvaise interprétation de la spécification, qui est "basé sur un sous-ensemble de JavaScript Langage de Programmation, la Norme ECMA-262 3ème Édition - décembre 1999." Il n'y a pas de JavaScript analyseurs qui conservera tout, mais à la dernière valeur associée à de multiples doubles des clés. Aller de l'avant et de dire Douglas Crockford, l'inventeur de JSON, qu'il est erroné.
Mal. Il y a au moins DEUX. Celui que j'ai écrit et celui fourni par Newtonsoft. Tout simplement parce que beaucoup des analyseurs de faire les mêmes erreurs que vous ne ne signifie pas qu'ils sont mauvais. Ils correctement en œuvre la spécification. Vous n'avez pas l'aimer, mais la persistance dans l'opinion que quelque chose qui est conforme à la cahier des charges est mauvais, c'est tout simplement stupide. Ce que vous obtenez lorsque vous l'exécutez "exécuter", la JS dans un objet JSON n'est pas pertinente pour la question de ce qu'est une bonne structure JSON, surtout si la structure JSON n'est pas destiné à être exécuté en tant que JS et est un simple transport de données. Fin.
OriginalL'auteur Mike Ruhlin