8 votes

Convertir une chaîne json sans guillemets en une carte

J'ai une chaîne de caractères au format Json, mais aucune des clés ou valeurs n'est entourée de 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 friend1Map = new HashMap<>();
friend1Map.put("name", "Dan");
friend1Map.put("age", 23);

Map friend2Map = new Hashmap<>();
friend2Map.put("name", "Zane");
friend2Map.put("age", 24);

Map 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>() {});

Cela provoquera une erreur, en disant :

Caractère inattendu ('n') : on attendait des guillemets pour commencer le nom du champ

Ensuite, j'ai essayé de changer la configuration du mapper:

mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
mapper.readValue(json, new TypeReference>() {});

Mais cela a provoqué une erreur en disant :

com.fasterxml.jackson.core.JsonParseException: Jeton non reconnu 'Bob' : on attendait ('true', 'false' ou 'null')
à [Source: {name: Bob, state: Colorado, Friends: [{ name: Dan, age: 23 }, {name: Zane, age: 24 }]}; line: 1, column: 11]

Existe-t-il un moyen d'obtenir cette carte lorsque des guillemets ne sont pas inclus dans la chaîne json?

2voto

Brian Points 589

Pour répondre à votre question: Il n'y a aucun moyen sûr d'obtenir votre JSON - qui n'est pas vraiment du JSON, car c'est invalide - converti en une Map.

Laissez-moi élaborer un peu plus (pourquoi ne peut-il pas être analysé en toute sécurité?) : Imaginez un "JSON" comme ceci :

{
    voici ma clé : et voici ma valeur et elle a même un deux-points :
}

Un JSON valide ressemblerait à cela

{
    "this is my key": "and here's my value and it even has a colon:"
}

Avec les guillemets, un analyseur peut déterminer en toute sécurité les clés et les valeurs. Sans eux, un analyseur est perdu.

1voto

L'ObjectMapper ne pourra pas analyser l'entrée Json si elle n'est pas valide, donc la réponse est non.

Testez votre Json ici : http://jsonlint.com/

Après avoir corrigé l'entrée Json, vous pourriez faire :

    ObjectMapper ob = new ObjectMapper();
    ob.configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
    String json = "{name: \"Bob\", state: \"Colorado\", Friends: [{ name: \"Dan\", age: 23 }, {name: \"Zane\", age: 24 }]}";

    Map theMap = ob.readValue(json, Map.class);
    System.out.println(theMap.get("name"));

Imprimera :

Bob

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X