如何序列化json到Map?
How to serialize json to Map?
我需要将 json 序列化到 Map。我儿子长得像这样:
{
items: [{
"name": "Test1",
"value": {
"id": 1,
"count": 5
}
}]
}
我有以下 类:
public class Value {
public int id;
public int count;
}
public class ItemManager {
public Map<String, Value> items;
}
我正试图像那样反序列化它:
class Main {
public static void main(String... args) {
ObjectMapper mapper = new ObjectMapper();
ItemManager manager = mapper.read(args[0], ItemManager.class);
}
}
但我得到以下异常:
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `test.ItemManager` out of START_ARRAY token
at [Source: (String)"{
我需要将 name
作为键,将 value
作为值。
谁能帮忙做一下?
这是一个简单的自定义反序列化器来做你想做的事(我用过 Jackson v2.12.4
):
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.ObjectCodec;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import java.io.IOException;
public class ItemManagerDeserializer extends StdDeserializer<ItemManager> {
public ItemManagerDeserializer() {
this(null);
}
public ItemManagerDeserializer(Class<?> vc) {
super(vc);
}
@Override
public ItemManager deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
JsonNode node = jp.getCodec().readTree(jp);
ObjectCodec mapper = jp.getCodec();
ItemManager itemManager = new ItemManager();
for (JsonNode element : node.get("items")) {
String key = element.get("name").asText();
ItemManager.Value value = mapper.treeToValue(element.get("value"), ItemManager.Value.class);
itemManager.getItems().put(key, value);
}
return itemManager;
}
}
我在 ItemManager
class 中创建了静态 Value
class 并在构造函数中实例化了 items
属性 ( new HashMap<>()
).
然后,您可以像这样注册和使用这个解串器:
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(ItemManager.class, new ItemManagerDeserializer());
mapper.registerModule(module);
ItemManager itemManager = mapper.readValue(args[0], ItemManager.class);
itemManager.getItems().forEach((key, value) -> System.out.println("key: " + key + ", value: " + value));
}
我需要将 json 序列化到 Map。我儿子长得像这样:
{
items: [{
"name": "Test1",
"value": {
"id": 1,
"count": 5
}
}]
}
我有以下 类:
public class Value {
public int id;
public int count;
}
public class ItemManager {
public Map<String, Value> items;
}
我正试图像那样反序列化它:
class Main {
public static void main(String... args) {
ObjectMapper mapper = new ObjectMapper();
ItemManager manager = mapper.read(args[0], ItemManager.class);
}
}
但我得到以下异常:
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `test.ItemManager` out of START_ARRAY token
at [Source: (String)"{
我需要将 name
作为键,将 value
作为值。
谁能帮忙做一下?
这是一个简单的自定义反序列化器来做你想做的事(我用过 Jackson v2.12.4
):
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.ObjectCodec;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import java.io.IOException;
public class ItemManagerDeserializer extends StdDeserializer<ItemManager> {
public ItemManagerDeserializer() {
this(null);
}
public ItemManagerDeserializer(Class<?> vc) {
super(vc);
}
@Override
public ItemManager deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
JsonNode node = jp.getCodec().readTree(jp);
ObjectCodec mapper = jp.getCodec();
ItemManager itemManager = new ItemManager();
for (JsonNode element : node.get("items")) {
String key = element.get("name").asText();
ItemManager.Value value = mapper.treeToValue(element.get("value"), ItemManager.Value.class);
itemManager.getItems().put(key, value);
}
return itemManager;
}
}
我在 ItemManager
class 中创建了静态 Value
class 并在构造函数中实例化了 items
属性 ( new HashMap<>()
).
然后,您可以像这样注册和使用这个解串器:
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(ItemManager.class, new ItemManagerDeserializer());
mapper.registerModule(module);
ItemManager itemManager = mapper.readValue(args[0], ItemManager.class);
itemManager.getItems().forEach((key, value) -> System.out.println("key: " + key + ", value: " + value));
}