0

我正在尝试将 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 格式和实体类。提前致谢!

4

2 回答 2

1

问题有点模糊,所以我可能错了,但您可能正在寻找注释来告诉杰克逊如何使用自定义构造函数来传递数据。如果是这样的话:

@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;
}

更多代码,但允许转换为中间类型。对于它的价值,Jackson 2.1 将包括标准的“委托”序列化器/反序列化器,以便定义一个封装此类逻辑的转换器。

于 2012-10-03T20:48:22.303 回答
0

使用 Genson 库http://code.google.com/p/genson/它工作正常。

您必须将构造函数的参数重命名为键和值,然后:

// this will tell to genson that he can use special debug symbols 
// to guess the constructor parameters :)    
Genson genson = new Genson.Builder().setWithDebugInfoPropertyNameResolver(true).create();
DefaultRequest req = genson.deserialize(json, DefaultRequest.class);

如果您的键类型是字符串并且值是原始类型(或原始包装器),则此方法有效,如果您希望将值作为复杂对象,那么它会更复杂一些。如果您是生成 json 的人,它会起作用。这是有关如何使用 Genson 实现此目的的链接。

于 2012-10-03T20:20:52.177 回答