java - Gson 转换返回 null java 对象

标签 java android json gson

我正在尝试使用 Gson 转换 java bean 中的 json 字符串,但它返回 null 值。

public static void convert(String args) {
    String json =
                "{"body":{"response":{"total":"294","num":"294","filelist":[{"id":"56712","camname":"Camera1","camid":"514","start":"2016-07-08 12:00:38","end":"2016-07-08 12:03:00","stream":"3","recReason":"Activity","filename":"fs/514/2016-07-08/AD_1_1_3_2016_07_08_12_00_57.mrv","snapshot":"fs-1/514/2016-07-08/AD_1_1_3_2016_07_08_12_00_57.jpg","nvrip":"192.168.0.200:8095"},{"id":"56708","camname":"Camera1","camid":"514","start":"2016-07-08 11:58:14","end":"2016-07-08 12:00:36","stream":"3","recReason":"Activity","filename":"fs-1/514/2016-07-08/AD_1_1_3_2016_07_08_11_58_33.mrv","snapshot":"fs-1/514/2016-07-08/AD_1_1_3_2016_07_08_11_58_33.jpg","nvrip":"192.168.0.200:8095"},{"id":"56705","camname":"Camera1","camid":"514","start":"2016-07-08 11:55:49","end":"2016-07-08 11:58:11","stream":"3","recReason":"Activity","filename":"fs-1/514/2016-07-08/AD_1_1_3_2016_07_08_11_56_08.mrv","snapshot":"fs-1/514/2016-07-08/AD_1_1_3_2016_07_08_11_56_08.jpg","nvrip":"192.168.0.200:8095"},{"id":"56702","camname":"Camera1","camid":"514","start":"2016-07-08 11:53:25","end":"2016-07-08 11:55:47","stream":"3","recReason":"Activity","filename":"fs-1/514/2016-07-08/AD_1_1_3_2016_07_08_11_53_44.mrv","snapshot":"fs-/514/2016-07-08/AD_1_1_3_2016_07_08_11_53_44.jpg","nvrip":"192.168.0.200:8095"},{"id":"56699","camname":"Camera1","camid":"514","start":"2016-07-08 11:51:00","end":"2016-07-08 11:53:22","stream":"3","recReason":"Activity","filename":"fs/514/2016-07-08/AD_1_1_3_2016_07_08_11_51_19.mrv","snapshot":"fs-/514/2016-07-08/AD_1_1_3_2016_07_08_11_51_19.jpg","nvrip":"192.168.0.200:8095"}],"status":"OK"}}}";

    // Now do the magic.
    RecordingListResponseDTO data = new Gson().fromJson(json, RecordingListResponseDTO .class);

    // Show it.
    System.out.println("converted data :"+data);
}

我的 Bean 类如下。 RecordingListResponseDTO

   public class RecordingListResponseDTO implements Serializable {
    private String status;
    private int total;
    private int num;
    List<FileListDTO> fileList;

    public RecordingListResponseDTO(){

    }
    public RecordingListResponseDTO(String status, int total, int num, List<FileListDTO> fileList) {
        this.status = status;
        this.total = total;
        this.num = num;
        this.fileList = fileList;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public int getTotal() {
        return total;
    }

    public void setTotal(int total) {
        this.total = total;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public List<FileListDTO> getFileList() {
        return fileList;
    }

    public void setFileList(List<FileListDTO> fileList) {
        this.fileList = fileList;
    }

    @Override
    public String toString() {
        return "RecordingListResponseDTO{" +
                "status='" + status + '\'' +
                ", total=" + total +
                ", num=" + num +

                ", fileList=" + fileList +
                '}';
    }}

FileListDTO.java

public class FileListDTO {
private int id;
private String camname;
private int camid;
private Date start;
private Date end;
private int stream;
private String recReason;
private String filename;
private String snapshot;
private String nvrip;

public FileListDTO(int id, String camname, Date start, int camid, Date end, int stream, String recReason, String filename, String snapshot, String nvrip) {
    this.id = id;
    this.camname = camname;
    this.start = start;
    this.camid = camid;
    this.end = end;
    this.stream = stream;
    this.recReason = recReason;
    this.filename = filename;
    this.snapshot = snapshot;
    this.nvrip = nvrip;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getCamname() {
    return camname;
}

public void setCamname(String camname) {
    this.camname = camname;
}

public int getCamid() {
    return camid;
}

public void setCamid(int camid) {
    this.camid = camid;
}

public Date getStart() {
    return start;
}

public void setStart(Date start) {
    this.start = start;
}

public Date getEnd() {
    return end;
}

public void setEnd(Date end) {
    this.end = end;
}

public int getStream() {
    return stream;
}

public void setStream(int stream) {
    this.stream = stream;
}

public String getRecReason() {
    return recReason;
}

public void setRecReason(String recReason) {
    this.recReason = recReason;
}

public String getFilename() {
    return filename;
}

public void setFilename(String filename) {
    this.filename = filename;
}

public String getSnapshot() {
    return snapshot;
}

public void setSnapshot(String snapshot) {
    this.snapshot = snapshot;
}

public String getNvrip() {
    return nvrip;
}

public void setNvrip(String nvrip) {
    this.nvrip = nvrip;
}

@Override
public String toString() {
    return "FileListDTO{" +
            "id=" + id +
            ", camname='" + camname + '\'' +
            ", camid=" + camid +
            ", start=" + start +
            ", end=" + end +
            ", stream=" + stream +
            ", recReason='" + recReason + '\'' +
            ", filename='" + filename + '\'' +
            ", snapshot='" + snapshot + '\'' +
            ", nvrip='" + nvrip + '\'' +
            '}';
}}

将 Json 字符串转换为 Java 对象后,我得到 null 值。 我做错了什么请建议我。 提前致谢。

最佳答案

先决条件:

已使用以下 JSON:

{
   "body":{
      "response":{
         "total":294,
         "num":294,
         "filelist":[
            {
               "id":56712,
               "camname":"Camera1",
               "camid":514,
               "start":"2016-07-08 12:00:38",
               "end":"2016-07-08 12:03:00",
               "stream":3,
               "recReason":"Activity",
               "filename":"fs/514/2016-07-08/AD_1_1_3_2016_07_08_12_00_57.mrv",
               "snapshot":"fs-1/514/2016-07-08/AD_1_1_3_2016_07_08_12_00_57.jpg",
               "nvrip":"192.168.0.200:8095"
            },
            {
               "id":56708,
               "camname":"Camera1",
               "camid":514,
               "start":"2016-07-08 11:58:14",
               "end":"2016-07-08 12:00:36",
               "stream":3,
               "recReason":"Activity",
               "filename":"fs-1/514/2016-07-08/AD_1_1_3_2016_07_08_11_58_33.mrv",
               "snapshot":"fs-1/514/2016-07-08/AD_1_1_3_2016_07_08_11_58_33.jpg",
               "nvrip":"192.168.0.200:8095"
            },
            {
               "id":56705,
               "camname":"Camera1",
               "camid":514,
               "start":"2016-07-08 11:55:49",
               "end":"2016-07-08 11:58:11",
               "stream":3,
               "recReason":"Activity",
               "filename":"fs-1/514/2016-07-08/AD_1_1_3_2016_07_08_11_56_08.mrv",
               "snapshot":"fs-1/514/2016-07-08/AD_1_1_3_2016_07_08_11_56_08.jpg",
               "nvrip":"192.168.0.200:8095"
            },
            {
               "id":56702,
               "camname":"Camera1",
               "camid":514,
               "start":"2016-07-08 11:53:25",
               "end":"2016-07-08 11:55:47",
               "stream":3,
               "recReason":"Activity",
               "filename":"fs-1/514/2016-07-08/AD_1_1_3_2016_07_08_11_53_44.mrv",
               "snapshot":"fs-/514/2016-07-08/AD_1_1_3_2016_07_08_11_53_44.jpg",
               "nvrip":"192.168.0.200:8095"
            },
            {
               "id":56699,
               "camname":"Camera1",
               "camid":514,
               "start":"2016-07-08 11:51:00",
               "end":"2016-07-08 11:53:22",
               "stream":3,
               "recReason":"Activity",
               "filename":"fs/514/2016-07-08/AD_1_1_3_2016_07_08_11_51_19.mrv",
               "snapshot":"fs-/514/2016-07-08/AD_1_1_3_2016_07_08_11_51_19.jpg",
               "nvrip":"192.168.0.200:8095"
            }
         ],
         "status":"OK"
      }
   }
}

第 1 步:

修改private List<FileListDTO> fileList的声明在RecordingListResponseDTO.java如下:

@SerializedName("filelist")
private List<FileListDTO> fileList

第 2 步:

定义以下类 MyDateTypeAdapter.java :

import java.lang.reflect.Type;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;

public class MyDateTypeAdapter implements JsonSerializer<Date>, JsonDeserializer<Date> {

    private DateFormat dateFormat;

    public MyDateTypeAdapter() {
        dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US); 
        dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); 
    }

    @Override
    public synchronized JsonElement serialize(Date date, Type type, JsonSerializationContext jsonSerializationContext) {
        return new JsonPrimitive(dateFormat.format(date));
    }

    @Override
    public synchronized Date deserialize(JsonElement jsonElement, Type type,
            JsonDeserializationContext jsonDeserializationContext) {
        try {
            return dateFormat.parse(jsonElement.getAsString());
        } catch (ParseException e) {
            throw new JsonParseException(e);
        }
    }

}

第 3 步:

修改方法convert(String args)如下:

public static void convert(String args) {
        JsonParser parser = new JsonParser();
        String json = parser.parse(args)
                            .getAsJsonObject()
                            .getAsJsonObject("body")
                            .getAsJsonObject("response")
                            .toString();

        // Now do the magic.
        RecordingListResponseDTO data = new GsonBuilder()
                 .registerTypeAdapter(Date.class, new MyDateTypeAdapter())
                .create().fromJson(json, RecordingListResponseDTO.class);
        // Show it.
        System.out.println("converted data :"+data);
}

出于测试目的,您可以尝试将 JSON 存储在文件中,即 D:/test.json并通过以下方式调用该方法:

String json = new String(Files.readAllBytes(Paths.get("D:/test.json")));
convert(json); 

关于java - Gson 转换返回 null java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38278441/

相关文章:

java - 你有 "architecture for architecture' s 的好例子吗?

java - ngdbc.jar 等效 Maven 存储库

android:无法在设备 "device"上安装 .apk:超时

c# - 无法从Elasticsearch获取带有NEST的任何文档

java - 使用 Gson 反序列化 json 不起作用

java - 为什么总是显示找不到文件

java - 获取错误 "Operation not allowed after ResultSet closed"

java - Android - 从后台线程返回 ArrayList 到 Activity

android - Paint.setTextSize(float) 使用哪种计量单位?

json - jq json - 按键名称选择