json与java反射_将一组JSON对象映射到java.util.Map,反之亦然

如何反序列化JSON字符串

您可以使用Jackson来反序列化JSON字符串:

例如,如果你有类Foo

public class Foo {

private Bar[] items;

// Constructor / Getters & Setters

}

那个类有一个类Bar的数组

public class Bar {

private int field1;

private String field2;

// Constructor / Getters & Setters

}

字段名称与JSON字符串中的字段名称匹配,那么您可以执行以下操作来转换它:

String jsonString = "{\"items\": [{\"field1\": 1,\"field2\": \"Hello\"},{\"field1\": 2,\"field2\":\"World\"}]}";

ObjectMapper mapper = new ObjectMapper();

Foo foo = mapper.readValue(jsonString,Foo.class);

如果您使用Maven,您的pom.xml中将需要以下依赖关系:

com.fasterxml.jackson.core

jackson-databind

${jackson.version}

解决问题的方法:

Option 1 – Custom Deserializer

编写一个自定义的JsonDeserializer来将您的JSON字符串反序列化为一个存储对象,其字段项类型为Map< String,Item>

public class CustomDeserializer extends JsonDeserializer {

@Override

public Storage deserialize(JsonParser jsonParser,DeserializationContext deserializationContext)

throws IOException {

Map map = new HashMap<>();

ObjectCodec oc = jsonParser.getCodec();

JsonNode rootNode = oc.readTree(jsonParser);

JsonNode items = rootNode.get("items");

for (int i = 0; i < items.size(); i++) {

JsonNode childNode = items.get(i);

Item item = new Item(childNode.get("field1").asInt(),childNode.get("field2").asText());

map.put(item.getField1(),item);

}

return new Storage(map);

}

}

然后,您将使用以下内容对Storage类进行注释:

@JsonDeserialize(using = CustomDeserializer.class)

你的存储类看起来像

@JsonDeserialize(using = CustomDeserializer.class)

public class Storage {

private Map items;

public Storage(Map map) {

this.items = map;

}

...

}

Option 2 – Create Map post deserialization

将JSON字符串反序列化为具有如开头所述的Item数组的Storage对象,然后构造您的Map< Integer,Item>后.

希望这可以帮助.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值