Jackson: attendait la citation double pour commencer le nom du champ

Jackson: s'attendait à des guillemets doubles pour commencer le nom du champ

Un exemple simple d'utilisation de Jackson pour convertir une chaîne JSON en Map.

  String json = "{name:\"example\"}";

  Map map = new HashMap();
  ObjectMapper mapper = new ObjectMapper();

  map = mapper.readValue(json, new TypeReference>(){});

Problème

Lorsque le programme est exécuté, il atteint le message d'erreur suivant

org.codehaus.jackson.JsonParseException:
   Unexpected character ('n' (code 110)): was expecting double-quote to start field name
   at [Source: java.io.StringReader@7c87c24a; line: 1, column: 3]

Solution

Dans la spécification JSON, il nécessite l'utilisation de guillemets doubles pour les noms de champ. Pour permettre à Jackson de gérer le nom de champ sans guillemets, ajoutezJsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES dans la configurationObjectMapper.

package com.example.jsonexample;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;

public class JsonMapExample {
    public static void main(String[] args) {

    String json = "{name:\"example\"}";

    Map map = new HashMap();
    ObjectMapper mapper = new ObjectMapper();

    mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);

    try {

        map = mapper.readValue(json,
                         new TypeReference>(){});
        System.out.println(map);

    } catch (JsonParseException e) {
        e.printStackTrace();
    } catch (JsonMappingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

  }
}

Sortie

{name=example}

Note
Dans JSON, les noms de champ non entre guillemets ne sont pas standard et doivent être évités.