改造 - 获取原始非 JSON 数组

Posted

技术标签:

【中文标题】改造 - 获取原始非 JSON 数组【英文标题】:Retrofit - Get Raw non JSON Array 【发布时间】:2018-07-02 15:32:55 【问题描述】:

我是第一次使用 Retrofit2,在获取非 JSON 格式的简单数组时遇到问题。

错误:java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 3 path $[0]

这意味着它不是 JSON 对象,因为它不以“”开头

我尝试添加 ScalarsConverter,但它似乎不起作用。

API:https://chasing-coins.com/api/v1/coins

界面:

public interface Retro_coins 
    @GET("api/v1/coins")
    Call<List<Coinlist>> getCoinlist();

类:

public class Coinlist 
    private List coinlist;

    public List getCoinlist() 
        return coinlist;
    
        

改造初始化和调用:

String API_BASE_URL = "https://chasing-coins.com/";

        OkHttpClient.Builder httpClient = new OkHttpClient.Builder();

        Retrofit.Builder builder = new Retrofit.Builder()
                        .baseUrl(API_BASE_URL)
                        .addConverterFactory(GsonConverterFactory.create())
                        .addConverterFactory(ScalarsConverterFactory.create())
                ;
        Retrofit retrofit = builder.client(httpClient.build()).build();
        Retro_coins client =  retrofit.create(Retro_coins.class);



// Fetch list
        Call<List<Coinlist>> call =
                client.getCoinlist();

// Execute the call asynchronously. Get a positive or negative callback.
        call.enqueue(new Callback<List<Coinlist>>() 
            @Override
            public void onResponse(Call<List<Coinlist>> call, Response<List<Coinlist>> response) 
                // The network call was a success and we got a response
                Log.w("Yes", response.toString());
            

            @Override
            public void onFailure(Call<List<Coinlist>> call, Throwable t) 
                Log.w("no", t.toString());

            
        );

谢谢!

【问题讨论】:

因为你的对象是错误的。你正在获取的只是一个字符串列表 如果您不使用 JSON,则不需要 addConverterFactory(GsonConverterFactory.create()) 使用您期望的格式 【参考方案1】:

当你使用private List coinlist; 时,Gson 期望对象是

  
   "coinlist":"[]"

你所提供的只是

["String","String","String"]

此外,当您使用 Call&lt;List&lt;Coinlist&gt;&gt; 时,您期望的数据是

[  
     
      "coinlist":"[]"
   
]

只需将您的电话从 Call&lt;List&lt;Coinlist&gt;&gt; 更改为 Call&lt;List&lt;String&gt;&gt;。那应该可以解决您的问题。如果您需要更多说明,请告诉我

【讨论】:

很好的答案和解释!【参考方案2】:

您的请求返回字符串。所以您需要将响应更改为字符串或需要将您的请求调用更改为字符串。

【讨论】:

以上是关于改造 - 获取原始非 JSON 数组的主要内容,如果未能解决你的问题,请参考以下文章

无法使用改造库获取数据

使用改造从 api 获取数据时出错

改造 2:从响应正文中获取 JSON

如何使用改造从 JSON 中获取数据?

使用改造获取带有 GSON 的嵌套 JSON 对象

使用改造从(本地)android资产文件夹获取Json数据