我需要序列化JSON,而不必附加到生成对象的特定架构,例如,某些通用set / map / hashmap。
作为输入 ,我有一个带有JSON的字符串。我不知道该JSON的架构。
作为输出, 我想要一个具有输入键值序列化的Java对象(例如Hashmap或类似对象)。
请注意, 输入JSON既具有基本字段,又具有Array / List。
我必须使用Java和Jackson(或其他一些库)。我怎么可能那样做?
Jackson数据绑定功能可以使用String键和Object值(也可以是地图或集合)将任何json输入读取到Map中。您只是告诉映射器,您想将json读入映射。您可以通过给映射器适当的类型引用来做到这一点:
import java.util.*; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; public class Test { public static void main(String[] args) { try { String json = "{ " + "\"string-property\": \"string-value\", " + "\"int-property\": 1, " + "\"bool-property\": true, " + "\"collection-property\": [\"a\", \"b\", \"c\"], " + "\"map-property\": {\"inner-property\": \"inner-value\"} " + "}"; ObjectMapper mapper = new ObjectMapper(); Map<String, Object> map = new HashMap<>(); // convert JSON string to Map map = mapper.readValue(json, new TypeReference<Map<String, Object>>(){}); System.out.println("input: " + json); System.out.println("output:"); for (Map.Entry<String, Object> entry : map.entrySet()) { System.out.println("key: " + entry.getKey()); System.out.println("value type: " + entry.getValue().getClass()); System.out.println("value: " + entry.getValue().toString()); } } catch (Exception e) { e.printStackTrace(); } } }
输出:
input: { "string-property": "string-value", "int-property": 1, "bool-property": true, "collection-property": ["a", "b", "c"], "map-property": {"inner-property": "inner-value"} } output: key: string-property value type: class java.lang.String value: string-value key: int-property value type: class java.lang.Integer value: 1 key: bool-property value type: class java.lang.Boolean value: true key: collection-property value type: class java.util.ArrayList value: [a, b, c] key: map-property value type: class java.util.LinkedHashMap value: {inner-property=inner-value}