使用Jackson嵌套Json到Map
我正在尝试动态地将一些JSON解析为Map。 以下适用于简单的JSON
String easyString = "{\"name\":\"mkyong\", \"age\":\"29\"}"; Map map = new HashMap(); ObjectMapper mapper = new ObjectMapper(); map = mapper.readValue(easyString, new TypeReference<HashMap>(){}); System.out.println(map);
但是当我尝试将一些更复杂的JSON与嵌套信息一起使用时失败了。 我正在尝试解析json.org中的示例数据
{ "glossary": { "title": "example glossary", "GlossDiv": { "title": "S", "GlossList": { "GlossEntry": { "ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": { "para": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": [ "GML", "XML" ] }, "GlossSee": "markup" } } } } }
我收到以下错误
线程“main”中的exceptioncom.fasterxml.jackson.databind.JsonMappingException:无法从START_OBJECT标记中反序列化java.lang.String的实例
有没有办法将复杂的JSON数据解析成地图?
我认为错误的发生是因为jackson遇到{字符时,它将剩余内容视为新对象,而不是字符串。 尝试将Object作为映射值而不是String。
public static void main(String[] args) throws IOException { Map map = new HashMap(); ObjectMapper mapper = new ObjectMapper(); map = mapper.readValue(x, new TypeReference(){}); System.out.println(map); }
产量
{glossary={title=example glossary, GlossDiv={title=S, GlossList={GlossEntry={ID=SGML, SortAs=SGML, GlossTerm=Standard Generalized Markup Language, Acronym=SGML, Abbrev=ISO 8879:1986, GlossDef={para=A meta-markup language, used to create markup languages such as DocBook., GlossSeeAlso=[GML, XML]}, GlossSee=markup}}}}}
将Map作为容器包装到一个哑对象中,如下所示:
public class Country { private final Map>> citiesAndCounties=new HashMap<>; // Generate getters and setters and see the magic happen. }
其余的只是使用您的Object映射器,使用Joda模块的示例Object mapper:
public static final ObjectMapper JSON_MAPPER=new ObjectMapper(). disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES). setSerializationInclusion(JsonInclude.Include.NON_NULL). disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS). registerModule(new JodaModule()); // Calling your Object mapper JSON_MAPPER.writeValueAsString(new Country());
希望有所帮助;-)