Convertir la chaîne json sans les guillemets dans une carte
J'ai une chaîne qui est au format Json, seulement aucun des clés ou des valeurs qui sont entourés par des guillemets. Par exemple, j'ai ceci:
String json = "{name: Bob, state: Colorado, Friends: [{ name: Dan, age: 23 }, {name: Zane, age: 24 }]}"
Je veux que cela devienne une carte qui ressemble à ceci:
Map<String, Object> friend1Map = new HashMap<>();
friend1Map.put("name", "Dan");
friend1Map.put("age", 23);
Map<String, Object> friend2Map = new Hashmap<>();
friend2Map.put("name", "Zane");
friend2Map.put("age", 24);
Map<String, Object> newMap = new HashMap<>();
newMap.put("name", "Bob");
newMap.put("state", "Colorado");
newMap.put("Friends", Arrays.asList(friend1Map, friend2Map));
J'ai essayé les deux méthodes suivantes:
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(json, new TypeReference<Map<String, Object>>() {});
Cela provoquera une erreur, en disant:
Unexpected character ('n'): was expecting double-quote to start field name
Puis j'ai essayé de changer la config de mapper:
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
mapper.readValue(json, new TypeReference<Map<String, Object>>() {});
Mais cela a jeté une erreur en disant:
com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'Bob': was expecting ('true', 'false' or 'null')
at [Source: {name: Bob, state: Colorado, Friends: [{ name: Dan, age: 23 }, {name: Zane, age: 24 }]}; line: 1, column: 11]
Est-il un moyen d'obtenir cette Carte, lorsque les guillemets ne sont pas inclus dans la chaîne json?
- Votre Chaîne Json n'est pas valide, le tester ici : jsonlint.com
- comment alors? et apparemment ce commentaire besoins de 15 caractères pour l'ajouter
- ou plutôt, comment pourrais-je faire est-il valide? Clairement, la question est de ne pas avoir le devis. Aurais-je à faire de méchants divise?
- Juste pour être clair: ce n'est pas Json, juste Json comme. Je ne pense pas que jackson peut gérer non cotées sring valeurs, seulement non cotées clés sont prises en charge. Cette réponse pourrait vous aider: stackoverflow.com/a/34794445/5108418
- Vous devriez regarder dans le GSON de la bibliothèque plutôt que de Jackson. Voir stackoverflow.com/questions/20557131/gson-parse-unquoted-value
- dang. Eh bien, après inspection, la Chaîne vient de l'utilisation d'un mappeur.writeValueAsString(map). Cette carte est essentiellement celui que je suis en visant à obtenir. Afin de contourner ce problème, je devrais être en mesure de remplacer le writeValueAsString avec quelque chose qui va s'échapper les guillemets à l'intérieur de la carte lors de l'écriture comme une chaîne de caractères. Est-il un moyen de le faire?
Vous devez vous connecter pour publier un commentaire.
Pour répondre à votre question: Il n'y a pas de sûr façon d'obtenir votre JSON - ce qui n'est pas JSON par la manière, parce que c'est invalide - converti en un
Map<String, Object>
.Permettez-moi de développer un peu (pourquoi ne peut-il pas être analysé de façon sécuritaire?):
Imaginez un "JSON", comme ceci:
JSON valide ressemblerait à quelque chose comme ceci
Avec les citations d'un analyseur peut déterminer en toute sécurité les clés et les valeurs. Sans eux, un analyseur est perdu.
La ObjectMapper de ne pas être en mesure d'analyser le format Json si elle n'est pas valide, donc la réponse est non.
Tester votre Json ici : http://jsonlint.com/
Après la correction du Json d'entrée que vous pourriez faire :
Sera d'impression :
JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES
. Il ne peut tout simplement pas analyser non cotées les valeurs de champ (il me semble).theMap
pas seulementString
valeurs. Il y a des tableaux dans que JSON. Ce que vous avez proposé n'est pas sécurisé. Utiliser unObjectNode
à la place.ObjectNode
soit. Je voulais dire plus deObjectNode root = ob.readValue(json, ObjectNode.class);
Map
de référence ici. Vous pourriez avoir unMap<String, ?>>
ouMap<String, Object>
mais c'est assez inutile.ObjectNode
vous donne beaucoup plus de flexibilité.vous pouvez vous pouvez utiliser le code suivant pour prétraiter la chaîne json, puis de l'analyser.