【问题标题】:Json array not getting from retrofit responseJson 数组未从改造响应中获得
【发布时间】:2018-04-12 06:07:50
【问题描述】:

在我的安卓应用中。我正在使用改造 2。我想从 api 获取 json 详细信息。响应即将到来,但 json 对象显示为空。 我正在获取 json 对象的大小。但我没有得到这些值。如何解析来自response.body 的json。 我想得到DATA_TITLE,DATA_IMAGE,DATA的值。

我是第一次使用改造。我尝试了不同的方法。请帮帮我。

我的 json 代码如下所示。所有的源代码也如下所示。

[{
        "ID": {
            "Tag": "string",
            "Method": 5,
            "Value": "68613",
            "status": true
        },
        "DATA_TITLE": {
            "Tag": "string",
            "Method": 5,
            "Value": "Hai aaaaaaa",
            "status": true
        },
        "DATA_IMAGE": {
            "Tag": "string",
            "Method": 5,
            "Value": "http://xxxxxx.com/desktopModules/Farabi.ICatalog/CatalogImages/488/C-2048_sd-eng.jpg",
            "status": true
        },
        "DATA": {
            "Tag": "string",
            "Method": 5,
            "Value": "",
            "status": true
        }
    }, {
        "ID": {
            "Tag": "string",
            "Method": 5,
            "Value": "68613",
            "status": true
        },
        "DATA_TITLE": {
            "Tag": "string",
            "Method": 5,
            "Value": "Hai aaaaaaa",
            "status": true
        },
        "DATA_IMAGE": {
            "Tag": "string",
            "Method": 5,
            "Value": "http://xxxxxx.com/desktopModules/Farabi.ICatalog/CatalogImages/488/C-2048_sd-eng.jpg",
            "status": true
        },
        "DATA": {
            "Tag": "string",
            "Method": 5,
            "Value": "",
            "status": true
        }
    }

]

我的 gradle 代码是

compile 'com.google.code.gson:gson:2.6.2'
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'

MainActivity.java

public class MainActivity extends AppCompatActivity {
private ArrayList<List<Objects>> data;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ApiInterface apiService =
            ApiClient.getClient().create(ApiInterface.class);


    Call<List<DataResponse>> call =apiService.getDetails(Util.TemplateName,Util.p,Util.Handler,Util.AppName,Util.Type,Util.F);
    call.enqueue(new Callback<List<DataResponse>>() {
        @Override
        public void onResponse(Call<List<DataResponse>> call, Response<List<DataResponse>> response) {


            if (response.isSuccessful()) {
                String json = gson.toJson(response.body());
                List<DataResponse> dataResponses = response.body();
                Log.d("LOG","Response size:"+dataResponses.size());
                Log.d("LOG","Response data:"+dataResponses.get(0).getDataList());

  // I want to get the value of DATA_TITLE,DATA_IMAGE, DATA

            }
        }

        @Override
        public void onFailure(Call<List<DataResponse>> call, Throwable t) {
            Log.e("LOG","Response error:"+t);
        }
    });


}
}

API接口

public interface ApiInterface {

@GET("getdetails")
Call<List<DataResponse>> getDetails(@Query("TemplateName") String TemplateName);
}

ApiClient.java

public class ApiClient {
private static Retrofit retrofit = null;
public static Retrofit getClient() {
    if (retrofit==null) {
        retrofit = new Retrofit.Builder()
                .baseUrl(Util.URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
    return retrofit;
}
}

数据响应

public class DataResponse {

private List<Objects> results;
@SerializedName("")
@Expose
private List<Objects> dataList = new ArrayList<>();

public List<Objects> getDataList() {
    return dataList;
}
public List<Objects> getResults() {
    return results;
}
public void setResults(List<Objects> results) {
    this.results = results;
}
}

Objects.java

public class Objects {

@SerializedName("ID")
private String id;
public String getId() {
    return id;
}

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

【问题讨论】:

  • 当我更改为 Call&lt;DataResponse&gt; 时,它显示错误是预期的 BEGIN_OBJECT 但在第 1 行第 2 列是 BEGIN_ARRAY。于是我改成了Call&lt;List&lt;DataResponse&gt;&gt;
  • 对不起,它应该是 List 而已。
  • 使用 jsonschema2pojo.org 并正确创建我们的 Pojo。我认为只有你的 Pojo 有问题。
  • @hasan_shaikh 我已经创建了我的 pojo。然后数组也变为空。

标签: java android json retrofit retrofit2


【解决方案1】:

首先看看是否一切正常。用JsonElement 替换你所有的List&lt;DataResponse&gt;,然后点击你的网络服务。 在response.body() 中获得响应后,手动解析或最好的方法是复制您的响应并转到http://www.jsonschema2pojo.org/ 并创建 POJO 类。然后在您的 &lt;PojoObject&gt; 改造 api 中传递新的 POJO 类对象。有关 POJO 的更多信息,请参阅 here

【讨论】:

  • 我创建了 pojo,但结果不正确。数组显示为空。
  • 我没有使用 JsonElement,因为我不了解如何使用 JsonElement。
【解决方案2】:

这是一个细节,但我总是在获取或发送 JSON 对象时添加标签 @Headers

例如

  @Headers("Content-Type: application/json")
    @GET("articles")
    Call<String> getArticles();

【讨论】:

    猜你喜欢
    • 2016-03-23
    • 2017-07-02
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 2017-07-26
    • 1970-01-01
    • 2017-04-19
    相关资源
    最近更新 更多