Tôi có một vấn đề deserializing một chuỗi JSON bằng cách sử dụng Jackson (nhưng tôi không có vấn đề serializing một đối tượng để JSON).Deserializing JSON với Jackson - Tại sao JsonMappingException "Không có hàm tạo phù hợp"?
Dưới đây tôi trình bày các lớp tôi sử dụng. vấn đề này được đưa ra khi tôi rececive một JSON-string (một ProtocolContainer đã được đăng ở nơi khác và lấy thông qua webservice) và muốn deserialize nó:
JSON-chuỗi:
{"DataPacketJSONString":null,"DataPacketType":"MyPackage.DataPackets.LoginRequestReply","MessageId":6604,"SenderUsername":null,"SubPacket":{"__type":"LoginRequestReply:#MyPackage.DataPackets","Reason":"Wrong pass or username","Success":false,"Username":"User1"}}
tôi cố gắng deserialize như điều này:
ProtocolContainer ret = ProtocolContainer.Create(jsonString);
và mã thực hiện trong ProtocolContainer có thể xem bên dưới. Ngoại lệ:
org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type [simple type, class MyPackage.ProtocolContainer]: can not instantiate from JSON object (need to add/enable type information?) at [Source: [email protected]; line: 1, column: 2]
Tôi thực sự đánh giá cao một số đầu vào tại đây =) Thx!
ProtocolContainer.java - một lớp container mà đóng gói của tôi "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 - một lớp cha cho tất cả datapackets tôi
public class DataPacket
{
}
LoginRequestReply. java - một DataPacket
package MyPackage.DataPackets;
import MyPackage.DataPacket;
public class LoginRequestReply extends DataPacket
{
public boolean LoginOK;
public int UserId;
}
Theo dõi: Sau khi một số điều phiền toái, tôi không nhận được lỗi sau: * JsonMappingException: Không thể khởi tạo giá trị kiểu [loại đơn giản, lớp MyPackage.ProtocolContainer] từ chuỗi JSON; không có hàm tạo chuỗi đơn/phương thức factory *. Nếu tôi thêm một constructor mà có một String, sau đó không có lỗi nhưng Object là "trống rỗng" ... Tôi không nghĩ rằng nó cần thiết để thêm hỗ trợ thực hiện trong constructor. ** Tôi nên sửa lỗi này như thế nào? ** – Ted