У меня проблема с десериализацией строки JSON с помощью Jackson (но у меня нет проблем с сериализацией объекта в JSON).
Ниже я представляю классы, которые я использую. Проблема возникает, когда я получаю JSON-строку (ProtocolContainer, который был сериализован в другом месте и получен через веб-сервис) и хочу десериализовать его:
JSON-строку:
{ "DataPacketJSONString": нулевой, "DataPacketType": "MyPackage.DataPackets.LoginRequestReply", "MessageId": 6604, "SenderUsername": нулевой, "подпакет": { "__ типа": "LoginRequestReply: # MyPackage.DataPackets"," Причина ":" Неверный пароль или имя пользователя "," Успех ": ложь," Имя пользователя ":" Пользователь1 "}}
Я пытаюсь десериализовать так:
ProtocolContainer ret = ProtocolContainer.Create(jsonString);
и код, который выполняется в ProtocolContainer, можно увидеть ниже. Исключение:
org.codehaus.jackson.map.JsonMappingException: не найден подходящий конструктор для типа [простой тип, класс MyPackage.ProtocolContainer]: невозможно создать экземпляр объекта JSON (необходимо добавить/включить информацию о типе?) в [Source: 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;
}