我有一个具有Map的域对象:
private Map<AutoHandlingSlotKey, LinkedHashSet<AutoFunction>> autoHandling;
Run Code Online (Sandbox Code Playgroud)
当我序列化对象时,我得到了这个:
"autoHandling" : [ "java.util.HashMap", {
} ],
Run Code Online (Sandbox Code Playgroud)
这个Map的关键是一个自定义对象:
public class AutoHandlingSlotKey implements Serializable {
private FunctionalArea slot; // ENUM
private String returnView; // ENUM
Run Code Online (Sandbox Code Playgroud)
所以,我不确定如何纠正我在反序列化对象时遇到的这个问题:
org.codehaus.jackson.map.JsonMappingException: Can not find a (Map) Key deserializer for type [simple type, class com.comcast.ivr.core.domain.AutoHandlingSlotKey]
Run Code Online (Sandbox Code Playgroud)
如果我没有访问域对象进行修改,有人可以帮助我理解如何纠正这个问题吗?
我有一个包含Map(带非String键)和其他一些字段的Class.
public class MyClass() {
private Map<KeyObject, OtherObject> map;
private String someField;
public MyClass(Map<KeyObject, OtherObject> map, String someField) {
this.map = map;
this.someField = someField;
}
// Getters & Setters
}
Run Code Online (Sandbox Code Playgroud)
我想使用Jackson对这个类进行序列化和反序列化.我看到了不同的方法,并决定尝试使用jackson模块.
我按照这篇文章并扩展了JsonDeserializer和JsonSerializer.问题是应该键入这些类,所以看起来应该是这样的
public class keyDeserializer extends JsonDeserializer<Map<KeyObject, OtherObject>> {
...
}
Run Code Online (Sandbox Code Playgroud)
KeySerializer也是如此.
然后添加到模块:
module.addSerializer(new keySerializer());
module.addDeserializer(Map.class, new keyDeserializer());
Run Code Online (Sandbox Code Playgroud)
但这显然是错误的,因为我得到了一个例外:
keySerializer does not define valid handledType() -- must either register with method that takes type argument or make serializer extend 'org.codehaus.jackson.map.ser.std.SerializerBase'
Run Code Online (Sandbox Code Playgroud)
我可以将我的序列化器和反序列化器输入MyClass,但后来我必须手动解析所有这些,这是不合理的.
更新:
我设法通过使用注释绕过代码中的模块创建 …
我有一个非常简单的Map,想在Jackson中进行序列化和反序列化,但是我无法使其正常工作。
我尝试了以下方法:
@JsonSerialize(keyUsing=TurnKeySerializer.class)
@JsonDeserialize(keyUsing = TurnKeyDeserializer.class)
Map<TurnKey, PlayerTurn> publicTurns = new TreeMap<>();
@JsonIgnoreProperties(ignoreUnknown = true)
@Data //Creates Getter/Setter etc
public class TurnKey implements Comparable<TurnKey> {
private final int turnNumber;
private final String username;
public TurnKey(int turnNumber, String username) {
this.turnNumber = turnNumber;
this.username = username;
}
@Override
public int compareTo(TurnKey o) {
int v = Integer.valueOf(turnNumber).compareTo(o.getTurnNumber());
if (v != 0) {
return v;
}
return username.compareTo(o.getUsername());
}
@Override
public String toString() {
return "{" +
"turnNumber:" + turnNumber +
", …Run Code Online (Sandbox Code Playgroud) 我正在使用骡子.我有一个JAVA对象,从我的内部类填充..它实际上是一个HashMap<String,Object>.Object可以是任何东西..另一个HashMap,或其他List..现在我必须将其转换为JSON(并删除所有那些值为NULL的键)..
当我使用给定的Mule Transformer时ObjectToJSON,它正在转换为适当的JSON ..但是无法删除NULL值.并且我找不到要在Custom-transformer中设置的任何属性,这将删除NULL值.. !!
那么,我写了一个自定义变换器,使用该net.sf.json-lib库,我能够删除NULL值.
但是在我的一个JAVA对象中,我有一个HashMap<Integer,String>,因为在JSON对象中,Integer不能是键,net.sf.json库给出了一个例外:
Exception stack is:
1. JSON keys must be strings. (java.lang.ClassCastException)
net.sf.json.JSONObject:1120 (null)
2. java.lang.ClassCastException: JSON keys must be strings. (net.sf.json.JSONException)
net.sf.json.JSONObject:1160 (null)
3. java.lang.ClassCastException: JSON keys must be strings. (net.sf.json.JSONException). Message payload is of type: HashMap (org.mule.api.transformer.TransformerMessagingException)
Run Code Online (Sandbox Code Playgroud)
所以它无法将其转换为JSON ..
那么什么是最可行的选择.. ??