Deserialisieren von JSON mit Jackson - Warum JsonMappingException "Kein passender Konstruktor"?

Ich habe ein problem Deserialisieren einen JSON-string mit Jackson (aber ich habe kein problem mit der Serialisierung ein Objekt zu JSON).

Unten präsentiere ich die Klassen die ich verwende. Das problem kommt, wenn ich rececive ein JSON-string (eine ProtocolContainer, die serialisiert wurde an anderer Stelle und abgerufen via webservice) und de-Serialisierung:

JSON-string:

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

Ich versuche zu Deserialisieren wie diese:

ProtocolContainer ret = ProtocolContainer.Create(jsonString);

und der code, der ausgeführt wird in ProtocolContainer kann unten gesehen werden. Ausnahme:

org.codehaus.jackson.Karte.JsonMappingException: Nein geeignet Konstruktor
gefunden für [einfache Art, Klasse
MeinPaket.ProtocolContainer]: können Sie nicht
instanziieren von JSON-Objekt (hinzufügen/aktivieren geben Sie die Informationen?)
[Quelle: java.io.StringReader@4059dcb0; Zeile: 1, Spalte: 2]

Ich würde wirklich zu schätzen einige hier eingeben =) Thx!!!

ProtocolContainer.java - eine container-Klasse, kapselt meine "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 - eine Superklasse für alle meine Datenpaketen befassen

public class DataPacket 
{

}

LoginRequestReply.java - ein Datenpaket

package MyPackage.DataPackets;

import MyPackage.DataPacket;

public class LoginRequestReply extends DataPacket
{
    public boolean LoginOK;
    public int UserId;
}

InformationsquelleAutor der Frage Ted | 2011-12-03

Schreibe einen Kommentar