麻烦与杰克逊反序列化

时间:2017-05-20 19:46:51

标签: java json serialization jackson

我正在为一个项目工作,我在反序列化某些对象时遇到了一些麻烦。我正在实现客户端 - 服务器通信,我必须在进程之间传递一些JSON。我正在通过流发送 AppointmentDto 类的列表。

我有类 AppointmentDto ,它看起来像: package project.serverSide.server.bussiness;

import java.sql.Date;
import java.time.LocalDate;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;

public class AppointmentDto {
    StringProperty DoctorName;
    StringProperty PatientName;
    ObjectProperty<Date> dateIssued;
    public StringProperty getDoctorName() {
        return DoctorName;
    }
    public void setDoctorName(StringProperty doctorName) {
        DoctorName = doctorName;
    }
    public StringProperty getPatientName() {
        return PatientName;
    }
    public void setPatientName(StringProperty patientName) {
        PatientName = patientName;
    }
    public ObjectProperty<Date> getDateIssued() {
        return dateIssued;
    }
    public void setDateIssued(SimpleObjectProperty<Date> simpleObjectProperty) {
        this.dateIssued = simpleObjectProperty;
    }

    @JsonCreator
    public AppointmentDto(@JsonProperty("doctor") String doctorName,@JsonProperty("patient") String patientName,@JsonProperty("dateIssued") Date dateIssued) {
        super();
        DoctorName = new SimpleStringProperty(doctorName);
        PatientName = new SimpleStringProperty(patientName);
        this.dateIssued = new SimpleObjectProperty<Date>(dateIssued);
    }


    public AppointmentDto() {
        super();
    }


}

我有 ApplicationClient ,它反序列化该列表

package project.eHealth;

import java.io.BufferedReader;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Component;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

import project.serverSide.server.Request;
import project.serverSide.server.Response;
import project.serverSide.server.bussiness.AppointmentDto;

@Component
public class ApplicationClient implements Runnable {

     BufferedReader in;
     PrintWriter out;
     String name;

     DoctorViewController doctorCtrl;
     PatientViewController patientCtrl;
     ObjectMapper mapper;

     public ApplicationClient(){

     }

     public void run() {

            // Make connection and initialize streams
            String serverAddress = "127.0.0.1";
            Socket socket;
            try {
                socket = new Socket(serverAddress, 9001);
                in = new BufferedReader(new InputStreamReader(
                        socket.getInputStream()));
                out = new PrintWriter(socket.getOutputStream(), true);
                 mapper = new ObjectMapper(); 
                   Request r = new Request();
                   r.setRequester("name");
                   r.setCommand("getAllAppointments");
                   try {
                    String req = mapper.writeValueAsString(r);
                    System.out.println(req);
                    out.println(req);
                } catch (JsonProcessingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


            // Process all messages from server, according to the protocol.
            while (true) {
               try {
                String line = in.readLine();
                Response resp = mapper.readValue(line,Response.class);

                if (resp.getAction().equals("RETURNED")){

                    System.out.println(resp.getData());
                    ArrayList<AppointmentDto> appointmentsList = mapper.readValue(resp.getData(), new TypeReference<ArrayList<AppointmentDto>>(){});

                    for (AppointmentDto ap : appointmentsList){
                        System.out.println(ap.getDoctorName()+" "+ap.getPatientName());
                    }
                    //doctorCtrl.setAppointmentsList(appointmentsList);
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


            }
        }

响应类如下所示:

package project.serverSide.server;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

public class Response {

    private String action;

    private String data;

    public Response() {
        super();
    }

    @JsonCreator
    public Response(@JsonProperty("action") String action,@JsonProperty("data") String data) {
        super();
        this.action = action;
        this.data = data;
    }

    public String getAction() {
        return action;
    }
    public void setAction(String action) {
        this.action = action;
    }
    public String getData() {
        return data;
    }
    public void setData(String data) {
        this.data = data;
    }


}

堆栈跟踪是:

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.sql.Date out of START_OBJECT token
 at [Source: [{"dateIssued":{"value":null,"bean":null,"name":"","bound":false},"patientName":{"value":"Pop Ioan","bean":null,"name":"","bound":false,"valueSafe":"Pop Ioan"},"doctorName":{"value":"Mihai Georgescu","bean":null,"name":"","bound":false,"valueSafe":"Mihai Georgescu"}},{"dateIssued":{"value":null,"bean":null,"name":"","bound":false},"patientName":{"value":"Popescu Mioara","bean":null,"name":"","bound":false,"valueSafe":"Popescu Mioara"},"doctorName":{"value":"Mihai Georgescu","bean":null,"name":"","bound":false,"valueSafe":"Mihai Georgescu"}}]; line: 1, column: 16] (through reference chain: java.util.ArrayList[0]->project.serverSide.server.bussiness.AppointmentDto["dateIssued"])
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:270)
    at com.fasterxml.jackson.databind.DeserializationContext.reportMappingException(DeserializationContext.java:1234)
    at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1122)
    at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1075)
    at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseDate(StdDeserializer.java:800)
    at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateBasedDeserializer._parseDate(DateDeserializers.java:172)
    at com.fasterxml.jackson.databind.deser.std.DateDeserializers$SqlDateDeserializer.deserialize(DateDeserializers.java:282)
    at com.fasterxml.jackson.databind.deser.std.DateDeserializers$SqlDateDeserializer.deserialize(DateDeserializers.java:267)
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:504)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeWithErrorWrapping(BeanDeserializer.java:511)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:400)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1191)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:314)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:148)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:287)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:259)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:26)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3798)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2861)
    at project.eHealth.ApplicationClient.run(ApplicationClient.java:76)
    at java.lang.Thread.run(Thread.java:745)

感谢任何形式的帮助!

0 个答案:

没有答案