Десериализация JSON с помощью Jackson - Почему JsonMappingException «Нет подходящего конструктора»?

У меня проблема с десериализацией строки JSON с помощью Джексона (но у меня нет проблем с сериализацией объекта в JSON).

Ниже я представляю классы, которые я Проблема возникает, когда я получаю JSON-строку (ProtocolContainer, который был сериализован в другом месте и получен через веб-сервис) и хочу десериализовать его:

JSON-string:

{"DataPacketJSONString": null, " DataPacketType ":" MyPackage.DataPackets.LoginRequestReply "," MessageId ": 6604," SenderUsername ": null," SubPacket ": {" __ type ":" LoginRequestReply: # MyPackage.DataPackets "," Reason ":" Неверный пароль или имя пользователя "," Success ": false," Username ":" User1 "}}

Я пытаюсь выполнить десериализацию следующим образом:

ProtocolContainer ret = ProtocolContainer.Create(jsonString);

и код, который выполняется в ProtocolContainer, можно увидеть ниже. Исключение:

org. codehaus.jackson.map.JsonMappingException: нет подходящего конструктора найдено для типа [простой тип, класс MyPackage.ProtocolContainer]: не может создать экземпляр из объекта JSON (нужно добавить / включить информацию о типе?) в [Источник: java.io.StringReader@4059dcb0; строка: 1, столбец: 2]

ProtocolContainer.java - класс контейнера, который инкапсулирует мои «подпакеты»:

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 - DataPacket

package MyPackage.DataPackets;

import MyPackage.DataPacket;

public class LoginRequestReply extends DataPacket
{
    public boolean LoginOK;
    public int UserId;
}
23
задан halfer 23 June 2019 в 16:29
поделиться