2016-07-09 2 views
2

Я пытаюсь преобразовать json string в java bean используя Gson, но это возвращаемое значение null.Gson conversion return null java object

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); 
} 

My Bean Class соответствует. 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. что я делаю неправильно, пожалуйста, предложите мне. Благодарим заранее.

+0

Попробуйте этот json после удаления тела и ответа, так как ваша структура класса не справляется с этим. –

+0

Я не могу изменить Json formate, потому что он отправляется с сервера. – MKY

ответ

2

Предпосылки:

Вслед за 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); 
+1

Привет @MKY ваша проблема решена? –

+0

Я попробую и дам вам знать ... завтра .. – MKY

+0

Еще одна вещь, если я хочу использовать дату как string.is необходимо использовать класс DateTypeAdapter ..? – MKY

1

то, что вам нужно изменить класс модели, как,

Первоначально в ваших данных ответа JSON содержит тег «тела», это означает, чтобы объект, сначала необходимо создать класс для тега объекта, то все данные содержат внутри ваше "тело" тег, поэтому анализировать все данные внутри от данных тела,

может помочь этот код,

public class RecordingListResponseDTO implements Serializable { 
    Recordinglist body; 

    public class Recordinglist(){ 
    Recordresponse response; 

    public class Recordresponse(){ 
     String total; 

     public int getTotal() { 
      return total; 
     } 

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

, но, как и этот орган, также содержит ответ и отклик, содержащий общее количество и число файлов. – MKY

+1

@MKY ваш синтаксический анализ данных из тега «отклик», поэтому вы не можете получить данные, изменить код как синтаксический анализ из «тела», тег. – prakash

+0

Еще один вопрос к u..therè - еще одна возможность, если есть только один список файлов, который входит в объект formate не в массив объекта. В этом случае gson не может разобрать.как это сделать? – MKY