我正在尝试将 json 反序列化为 java 实体,但我无法让 Jackson 将 json 数组反序列化为 Pair[]。 Pair 是一个自定义类,但它遵循 SO 上找到的标准形式。 :
public class Pair<K, V> {
private final K k;
private final V v;
public Pair(K k, V v) {
this.k = k;
this.v = v;
}
public K getKey() {
return k;
}
public V getValue() {
return v;
}
...
}
Json 对象可以根据需要进行更改,但我正在尝试使用以下形式的内容:
{"priority":1,"account":"012345","tld":"com","name":"domain_check","params":[{"key":"domain","value":"domain.com"}]}
我的“DefaultRequest”实体类包含:
@Entity
public class DefaultRequest implements Serializable, Comparable, Request {
//other fields...
private Pair[] params;
@Override
public Pair[] getParams() {
return params;
}
@Override
public void setParams(Pair[] params) {
this.params = params;
//other methods...
}
}
如果有人已经回答了这个问题,我很抱歉。诚然,我对使用 Jackson 很陌生,但我已经在这上面花了近 3 天的时间,而且我有一个截止日期。我还必须相信之前有人必须反序列化到包含 Pair[] 的实体。欢迎任何想法。如果有更好的替代方案,我可以完全灵活地更改 json 格式和实体类。 提前致谢!
最佳答案
问题有点模糊,所以我可能是错的,但您可能正在寻找注释来告诉 Jackson 如何使用自定义构造函数来传递数据。如果是这样:
@JsonCreator
public Pair(@JsonProperty("key") K k,
@JsonProperty("value") V v) {
...
}
这适用于所有类型,而不仅仅是基元,也不会尝试猜测什么去了哪里。需要名称注释只是因为 JDK 不会在字节码中添加参数名称,因此与方法名称不同,它们不可用。
编辑:
看来需要转型了。那么这个怎么样:
@JsonCreator
public Pair(Map<String,String> json)
{
Map.Entry<String,String> en = json.entrySet().iterator().next();
key = en.getKey();
value = en.getValue();
}
@JsonValue
public Map<String,String> asMap() {
Map<String,String> m = new HashMap<String,String>();
m.put(key, value);
return m;
}
代码较多,但允许转换为中间类型。就其值(value)而言,Jackson 2.1 将包含标准的“委托(delegate)”串行器/解串器,以便定义封装此类逻辑的转换器。
关于java - 将 Json 反序列化为包含通用对数组的 Java 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12714785/