我在使用Jackson来反序列化JSON字符串时遇到问题(但是我没有问题将对象序列化为JSON)。
下面,我介绍我使用的类。当我接收到JSON字符串(已在其他地方进行序列化并通过Web服务检索的ProtocolContainer)并想反序列化时,就会出现问题:
JSON字符串:
{“ DataPacketJSONString”:null,“ DataPacketType”:“
MyPackage.DataPackets.LoginRequestReply”,“ MessageId”:6604,“
SenderUsername”:null,“ SubPacket”:{“ __ type”:“
LoginRequestReply:#MyPackage.DataPackets”,“原因”:“错误的密码或用户名”,“成功”:false,“用户名”:“
User1”}}
我尝试像这样反序列化:
ProtocolContainer ret = ProtocolContainer.Create(jsonString);
在ProtocolContainer中执行的代码如下所示。例外:
org.codehaus.jackson.map.JsonMappingException:在类型[简单类型,MyPackage.ProtocolContainer类]上找不到合适的构造函数:无法从JSON对象实例化(需要添加/启用类型信息?),位于[来源:java.io。
StringReader @ 4059dcb0; 行:1,列:2]
ProtocolContainer.java-封装我的“ SubPackets”的容器类:
import java.io.IOException;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import MyPackage.DataPackets.*;
public class ProtocolContainer
{
public String SenderUsername;
public String DataPacketType;
public long MessageId;
public String DataPacketJSONString;
public DataPacket SubPacket;
public ProtocolContainer(DataPacket dp)
{
DataPacketType = dp.getClass().toString().substring(6);
SubPacket = dp;
}
public String toJSON()
{
try {
if (SubPacket != null)
this.DataPacketJSONString = ProtocolContainer.mapper.writeValueAsString(SubPacket);
return ProtocolContainer.mapper.writeValueAsString(this);
} catch (JsonGenerationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JsonMappingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public static ObjectMapper mapper = new ObjectMapper();
public static ProtocolContainer Create(String jsonString)
{
ProtocolContainer pc = null;
try {
pc = mapper.readValue(jsonString, ProtocolContainer.class); // error here!
} catch (JsonParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JsonMappingException e) {
// TODO Auto-generated catch block
e.printStackTrace(); // Exception when deserializing
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try
{
if (pc != null && pc.DataPacketType == "LoginRequest")
pc.SubPacket = mapper.readValue(jsonString, LoginRequest.class);
}
catch (JsonParseException e)
{
e.printStackTrace();
}
catch (JsonMappingException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
return pc;
}
}
DataPacket.java-我所有数据包的超类
public class DataPacket
{
}
LoginRequestReply.java-一个数据包
package MyPackage.DataPackets;
import MyPackage.DataPacket;
public class LoginRequestReply extends DataPacket
{
public boolean LoginOK;
public int UserId;
}
错误消息说明了一切,您的ProtocolContainer没有默认的构造函数,因此Jackson无法创建它的实例。(由于当前创建ProtocolContainer的唯一方法是传入DataPacket。)
问题内容: 我正在使用Jackson来将json数组反序列化为某些对象。这是我的课: 错误: 我一直在使用GSON,但由于性能问题需要放弃它。当我切换到Jackson时,我只是向所有类添加了默认构造函数,这可能是不必要的,因为没有定义其他构造函数… 编辑: 哦,JSON看起来像这样: 问题答案: 我没有与Jackson一起工作,但我想问题是Business类是成员类而不是静态的。 杰克逊需要做的是
问题内容: 我正在实现他们文档中提供的firebase示例。我遇到此错误: com.fasterxml.jackson.databind.JsonMappingException:没有为类型[简单类型,类com.XYZ。$ BlogPost]找到合适的构造函数:无法从JSON对象实例化(需要添加/启用类型信息吗?) 这是我的代码: 我在同一件事上经历了很多问题,说要包含反序列化JSON所需的空构造
问题内容: 只有最后一部分(我的意思是我仅对此有问题) 当我编译它时,我没有合适的构造函数错误。为什么是这样??顺便说一下,Spirtokouto类的目的是要增加一个计数值(权重)。我可以将一个班级扩展到> 1个班级吗? 问题答案: Box类有两个构造函数:,但它们都不带四个参数,而您要用四个参数来调用它,因此请更改此参数: 对此: 调用必须首先在构造函数中进行。 我可以将一个班级扩展到 > 1个
活体->动物->NPC->人->孩子 Live、Animal和NPC不实现Serializable。我不能改变这三门课。Person和Child确实实现了Serializable。人和生活也是抽象的类。我可以很好地序列化一个人(他是一个孩子)并发送它,但是当我尝试反序列化一个人(他是一个孩子)时,我在Child上得到一个InvalidClassException(无效构造函数),表示“no val
问题内容: 我尝试测试以下代码没有成功: 这个问题不同于这个问题: 用Jackson解序列化JSON-为什么JsonMappingException“没有合适的构造函数”? 这个: [JsonMappingException:没有找到适合类型简单类型,类]的构造函数:无法从JSON对象实例化 这个: JsonMappingException:没有找到适合类型[简单类型,类]的构造函数:无法从JSO
我正在尝试反序列化以下JSON: 我已反序列化文件: 在以下对象结构中: 规则efinition.java 定义。爪哇 和JAVA 我得到了以下错误 我看到问题是因为'and-condition-1'只是一个值,我如何反序列化这些,我想知道我应该写一个自定义反序列化器(或者)有什么解决方法吗?