Supprimer les doublons d'une Chaîne Json en Java?
J'ai une Chaîne Json avec des valeurs en double:
Chaîne json = "{\"Sign_In_Type\":\"Action\",\"Sign_In_Type\":\"Action\"}";
que correctement déclenche une exception lorsque j'essaie de créer un JSONObject:
try { JSONObject json_obj = new JSONObject(json); Type de chaîne = json_obj.getString("Sign_In_Type"); } catch (JSONException e) { throw new RuntimeException(e); }
Erreur:
Exception in thread "main" java.lang.RuntimeException: org.json.JSONException: Double de clé "Sign_In_Type" au com.campanja.app.Le téléchargement.principale(Upload.java:52) Causés par: org.json.JSONException: Double de clé "Sign_In_Type" au org.json.JSONObject.putOnce(JSONObject.java:1076) au org.json.JSONObject.(JSONObject.java:205) au org.json.JSONObject.(JSONObject.java:402) au com.campanja.app.Le téléchargement.principale(Upload.java:49)
Est-il une façon intelligente de retrait ou de vérification des doublons avant de me convertir à une JSONOBject?
J'ai essayé de créer:
Set = new HashSet(Tableaux.asList(json));
mais qui me donne:
[{"Sign_In_Type":"Action","Sign_In_Type":"Action"}]
Tout suggesstions bienvenue, merci!
OriginalL'auteur C.A | 2013-09-25
Vous devez vous connecter pour publier un commentaire.
Deux options que je peux penser de droit au large de la chauve-souris:
org.json.JSONObject
, et faire une légère modification au code laisse automatiquement les doublons. C'est un peu dangereux. Une autre option est de créer une version modifiée qui, tout simplement, les valide et les modifie.L'Extension De JSONObject Exemple De Travail
Le code ci-dessous permet de créer un JSONOBbject avec une chaîne de caractères contenant des doubles des clés. Des Exceptions sont levées que lorsque vous avez deux valeurs-clés qui ont la même clé, mais des valeurs différentes. C'était parce que je pense que ce serait un problème de choisir au hasard, lequel des deux doit être attribué (par exemple, la valeur ultérieure?). Bien sûr, cela peut être modifié pour fonctionner comme vous le souhaitez (par exemple, conserver la dernière valeur de plusieurs touches).
Modifié Classe
Principale méthode
JSONObject
et écraser juste putOnce(...), puis utilisez l'objet hérité?Exactement! Je suis en train de le faire maintenant...
Merci, je vais le faire maintenant!
Juste mis à jour ma réponse aussi bien pour inclure le code. Pas sûr de la version que vous avez bien que, JSONObject a été mis à jour il y a 3 mois mais putOnce ne semble pas avoir changé: github.com/douglascrockford/JSON-java/archive/master.zip
OriginalL'auteur Menelaos Bakopoulos
En supposant que
Chaîne json = "{\"Sign_In_Type\":\"Action\",\"Sign_In_Type\":\"Action\"}";
est une fiction pour les tests, puis-je vous demander si la création des données comme une Chaîne de caractères est le meilleur choix en premier lieu? Pourquoi pas une table de hachage, ou d'une autre structure que ce soit, qui remplace la réutilisation ultérieure du nom de l'un ou l'ignore ou renvoie une erreur lorsque vous ajouter? N'attendez pas jusqu'à ce que la conversion en JSON pour rendre vos données valides.
Désolé, raté le commentaire précédant. Peut la DB requête être amenés à transmettre les valeurs uniques?
OriginalL'auteur Dan
Vous pouvez faire usage de l'Jackson bibliothèque de parser JSON. J'avais des problèmes pour effectuer la même tâche que vous org.json du paquet, mais je me suis tourné vers Jackson et je l'ai résolu: http://wiki.fasterxml.com/JacksonHome
OriginalL'auteur russellhoff
J'ai développé Menelaos Bakopoulos répondre, de sorte que, si les valeurs intérieures sont aussi avec des doublons, il ne crée pas de problèmes. la première solution a travaillé sur le premier niveau seulement.
OriginalL'auteur Asaf Bartov
Désolé, je ne peux pas commenter sur Menelaos Bakopoulos réponse en raison de la réputation<50... Stupide système
Votre solution ne fonctionne malheureusement pas ici:
Il semble que l'appel à
super(json)
dansJSONObjectIgnoreDuplicates
'constructeur envoie le code dans une boucle à l'intérieur deJSONObject
, pasJSONObjectIgnoreDuplicates
;{Je suis en train d'essayer Asaf Bartov de la solution, mais il n'y a pas d'appel de
JSONObjectIgnoreDuplicates
àJsonDupTokener
, donc appart de surcharger le constructeur deJSONObjectIgnoreDuplicates
comme suit, je ne vois pas comment cela pourrait fonctionner:EDIT: je confirme, cela fonctionne :))))
Merci à tous!!!!
OriginalL'auteur user2115112
Avec Google Gson vous pouvez décider quoi faire avec les doublons dans la chaîne d'entrée. Vous devez enregistrer votre propre
TypeAdapter
responsable de la sérialisation/désérialisation des objets. Il devrait ressembler à ceci:Ensuite, vous pouvez analyser votre chaîne:
La carte contiendra uniquement la première
"Sign_In_Type"
.OriginalL'auteur Kirill Simonov