我有像JSON这样的数据:
{
"foo": "bar",
"key": true,
"otherKey": 10
}
键是String,值是基元(int,float,double,long等)或String。我想为上面的每一个都提供一个简单的无铸造包装。
这是我的包装类:
public final class Wrapper<T> {
private String key;
private T value;
}
如果我在要反序列化的对象中指定Wrapper[] wrappedValues
,我可以(使用Jackson或GSON)将地图反序列化为包装器列表吗?
感谢您的回复!
答案 0 :(得分:2)
首先,您指定的输入永远不能反序列化为数组或集合,因为它不是一个。一组键值的json集合看起来像这样
[
{"foo": "bar"},
{"key": true},
{"otherKey": 10}
]
如果您按照此类进行操作,可以将其反序列化为Wrappers
的集合
public class Wrapper<T> {
private String key;
private T value;
@JsonAnySetter
public void set(String key, Object value) {
this.key = key;
this.value = (T)value;
}
public String toString() { // just for nice printing
return key + "=" + value.toString();
}
}
然后你必须告诉Jackson什么是将托管反序列化json的集合的泛型类型:
public static void main(String[] args)
{
String str = "[ {\"foo\": \"bar\"}, {\"key\": true}, {\"otherKey\": 10} ]";
try (InputStream is = new ByteArrayInputStream(str.getBytes("UTF-8"))) {
ObjectMapper objectMapper = new ObjectMapper();
JavaType listWrappersType = objectMapper.getTypeFactory()
.constructCollectionType(List.class, Wrapper.class);
List<Wrapper> list = objectMapper.readValue(is, listWrappersType);
System.out.println(list);
} catch (Exception e) {
e.printStackTrace();
}
}
输出:
[foo=bar, key=true, otherKey=10]
如果您只想加载键值对而不用担心值类型,那么使用Jackson,您可以将其全部加载到Map<String, ?>
public static void main(String[] args)
{
String str = "{ \"foo\": \"bar\", \"key\": true, \"otherKey\": 10 }";
try (InputStream is = new ByteArrayInputStream(str.getBytes("UTF-8"))) {
Map<String, ?> map = new ObjectMapper().readValue(is, Map.class);
// print map contents
System.out.println(map);
// print type of map values
System.out.print(entry.getKey() + "=" + entry.getValue().getClass()+ ", "));
System.out.println();
} catch (Exception e) {
e.printStackTrace();
}
}
输出
{foo=bar, key=true, otherKey=10}
foo=class java.lang.String, key=class java.lang.Boolean, otherKey=class java.lang.Integer,