簡體   English   中英

如何使用Retrofit和Gson在Android中解析嵌套的JSON數據

[英]How to parse nested JSON data in Android with Retrofit and Gson

我熟悉使用Retrofit解析基本JSON數據,但為此JSON響應而努力實現正確的POJO對象。

這是JSON數據:

{
    "observations": [
      {
        "id": "0",
        "type": "1st type",
        "data": [
            {
              "name": "some_name",
              "result": "some_result"
            }
          ]
      },
      {
        "id": "1",
        "type": "2nd type",
        "data": [
            {
              "name2": "some_name2",
              "measurement": "some_measurement",
              "field": "some_field",
              "result2": "some_result2"
            }
          ]
      }
    ]
}

我已經為兩種觀察類型創建了類:

public class DataType1{

    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("measurement")
    @Expose
    private String measurement;
    @SerializedName("field")
    @Expose
    private String field;
    @SerializedName("result")
    @Expose
    private String result;
}

public class DataType2 {
    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("result")
    @Expose
    private String result;
}

一般想法是通過“類型”確定數據的類型並將其發送到相應的類:

if(response.body().getType.equals("1st type"))
{
    Gson gson = new GsonBuilder().create();
    DataType1 data = gson.fromJson(response.body().getObservation, DataType1.class);
}

我假設,接下來,我必須創建一個單獨的ObservationsResponce類以獲得觀察列表:

public class Observation {
    @SerializedName("id")
    @Expose
    private String id;
    @SerializedName("type")
    @Expose
    private String type;
    @SerializedName("observation")
    @Expose
    private List<??What Should Be Here??> observation = null;
}

但是問題是觀察值可以具有不同的數據類型和內部如此不同的字段。 在這種情況下,此列表應該是哪個類?

MyObservation.java


public class MyObservation
{
    private Observations[] observations;

    public Observations[] getObservations ()
    {
        return observations;
    }

    public void setObservations (Observations[] observations)
    {
        this.observations = observations;
    }

    @Override
    public String toString()
    {
        return "MyObservation [observations = "+observations+"]";
    }
}


Observations.java

public class Observations
{
    private Data[] data;

    private String id;

    private String type;

    public Data[] getData ()
    {
        return data;
    }

    public void setData (Data[] data)
    {
        this.data = data;
    }

    public String getId ()
    {
        return id;
    }

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

    public String getType ()
    {
        return type;
    }

    public void setType (String type)
    {
        this.type = type;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [data = "+data+", id = "+id+", type = "+type+"]";
    }
}

Data.java

public class Data
{
    private String result;

    private String name;


    //add these fields manually
    private String measurement;

    private String field;

    public String getResult ()
    {
        return result;
    }

    public void setResult (String result)
    {
        this.result = result;
    }


    public String getMeasurement ()
    {
        return measurement;
    }

    public void setMeasurement (String measurement)
    {
        this.measurement = measurement;
    }

    public String getField ()
    {
        return field;
    }

    public void setField (String field)
    {
        this.field = field;
    }


    public String getName ()
    {
        return name;
    }

    public void setName (String name)
    {
        this.name = name;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [result = "+result+", name = "+name+"]";
    }
}

而且最好使用相同的密鑰,然后如果您想要不同的密鑰並想要生成POJO,則使用此鏈接

檢查此pojo類,我不確定它是否有效

package com.example;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

import java.util.List;

public class Datum {

@SerializedName("name")
@Expose
private String name;
@SerializedName("result")
@Expose
private String result;
@SerializedName("name2")
@Expose
private String name2;
@SerializedName("measurement")
@Expose
private String measurement;
@SerializedName("field")
@Expose
private String field;
@SerializedName("result2")
@Expose
private String result2;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getResult() {
    return result;
}

public void setResult(String result) {
    this.result = result;
}

public String getName2() {
    return name2;
}

public void setName2(String name2) {
    this.name2 = name2;
}

public String getMeasurement() {
    return measurement;
}

public void setMeasurement(String measurement) {
    this.measurement = measurement;
}

public String getField() {
    return field;
}

public void setField(String field) {
    this.field = field;
}

public String getResult2() {
    return result2;
}

public void setResult2(String result2) {
    this.result2 = result2;
}

}

class Example {

@SerializedName("observations")
@Expose
private List<Observation> observations = null;

public List<Observation> getObservations() {
    return observations;
}

public void setObservations(List<Observation> observations) {
    this.observations = observations;
}

}

class Observation {

@SerializedName("id")
@Expose
private String id;
@SerializedName("type")
@Expose
private String type;
@SerializedName("data")
@Expose
private List<Datum> data = null;

public String getId() {
    return id;
}

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

public String getType() {
    return type;
}

public void setType(String type) {
    this.type = type;
}

public List<Datum> getData() {
    return data;
}

public void setData(List<Datum> data) {
    this.data = data;
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM