2011-12-03 61 views
0

我refeer这个问题对我的类和代码.NET生成,但这次与另一个错误: Deserializing JSON with Jackson - Why JsonMappingException "No suitable constructor"?反序列化JSON字符串中使用杰克逊

因为我有上述的问题添加一个空的构造函数ProtocolContainer。

所以现在情况是.NET应用程序(C#)使用DataContractJsonSerializer创建JSON字符串。 ProtocolContaier有一个定义为DataPacket的“SubPacket”,然后有DataPacket的子类(所以这是一个多态问题)。

的字符串看起来是这样的:

{"DataPacketJSONString":null,"DataPacketType":"MyPackage.DataPackets.LoginRequestReply","MessageId":6604,"SenderUsername":null,"SubPacket":{"__type":"LoginRequestReply:#MyPackage.DataPackets","Reason":"Wrong pass or username","Success":false,"Username":"User1"}}

注意__type在上面的JSON。这是.NET创建的,用于跟踪“SubPacket”是什么类型的对象。

问题是如何在Java端使用Jackson进行反序列化?

它给了我下面的错误:

org.codehaus.jackson.map.JsonMappingException: Could not resolve type id 'LoginRequestReply:#MyPackage.DataPackets' into a subtype of [simple type, class MyPackage.DataPacket] at [Source: [email protected]; line: 1, column: 168] (through reference chain: MyPackage.ProtocolContainer["SubPacket"])

我的猜测是,杰克逊不能解释JSON字符串的__type以上。我认为这是它的格式。问题是:如何解决?

DataPacket.java - 超在ProtocolContainer定义(见上面的链接):

package MyPackage; 

import org.codehaus.jackson.annotate.JsonSubTypes; 
import org.codehaus.jackson.annotate.JsonTypeInfo; 

import MyPackage.DataPackets.*; 

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="__type") 
@JsonSubTypes(
{ 
    @JsonSubTypes.Type(value = LoginRequest.class, name = "LoginRequest"), 
    @JsonSubTypes.Type(value = LoginRequestReply.class, name = "LoginRequestReply") 
}) 
public class DataPacket 
{ 

} 

回答

1

所以,一个解决方案(我发现丑)是适应JsonSubTypes所以它看起来一样创建什么C#结尾:

@JsonSubTypes(
{ 
    @JsonSubTypes.Type(value = LoginRequest.class, name = "LoginRequest:#MyPackage.DataPackets"), 
    @JsonSubTypes.Type(value = LoginRequestReply.class, name = "LoginRequestReply:#MyPackage.DataPackets") 
}) 

我还没有找到任何更好的方法。

+0

我不明白这是什么丑陋的。在我看来,JSON中的类型名称被映射到Java目标类型的名称。更清洁的解决方案会是什么样子? –