Java 使用Halarious和Teleport.org进行改造

Java 使用Halarious和Teleport.org进行改造,java,android,json,api,Java,Android,Json,Api,我正在开发一个小型android应用程序,它使用teleport.org API列出城市区域。为此,我使用以下响应URL: 响应如下所示: { "_links": { "curies": [ { "href": "https://developers.teleport.org/api/resources/Location/#!/relations/{rel}/", "name": "location", "template

我正在开发一个小型android应用程序,它使用teleport.org API列出城市区域。为此,我使用以下响应URL:

响应如下所示:

{
  "_links": {
    "curies": [
      {
        "href": "https://developers.teleport.org/api/resources/Location/#!/relations/{rel}/",
        "name": "location",
        "templated": true
      }
    ],
    "self": {
      "href": "https://api.teleport.org/api/urban_areas/"
    },
    "ua:item": [
      {
        "href": "https://api.teleport.org/api/urban_areas/teleport:u173z/",
        "name": "Amsterdam"
      }
    ]
  },
  "count": 153
}
这给了我一个HAL格式的json文件。因为我使用改型来加载API,所以我需要一个自定义转换器来获取存储在POJO类中的信息。我为此选择了哈拉里奥

我是这样安排的

主要活动:

String url = "https://api.teleport.org/api/";
TextView txt_city;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    txt_city = (TextView) findViewById(R.id.txt_city);

    setSupportActionBar(toolbar);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });

    getCities();

}

void getCities() {
    //Creating Rest Services
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(url)
            .addConverterFactory(HALConverterFactory.create(CityData.class))
            .build();

    RestInterface service = retrofit.create(RestInterface.class);

    Call<CityData> call = service.getCityList();


    call.enqueue(new Callback<CityData>() {
        @Override
        public void onResponse(Call<CityData> call, Response<CityData> response) {
            try {
                String city = response.body().getUaItem().get(0).getName();
                //Log.e("stad", city);

                txt_city.setText("city 12  :  " + city);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onFailure(Call<CityData> call, Throwable t) {
            // Log error here since request failed
        }
    });
}
但问题是我的getUaItem是完全空的。它只是返回[]。因此get(0)是无用的,因为数组是空的。我可以得到计数tho,因为这是最高级别的,但是UaItem给我带来了问题。为什么会这样

亲切问候,


Wouter

我认为这是因为原始响应变量名是
ua:Item
,而不是
uaItem
。可能自动映射在这里不起作用。您可以通过显式写出变量名来修复它:

@serializedName("ua:item") private List<UaItem> uaItem = new ArrayList<UaItem>();
@serializedName(“ua:item”)私有列表uaItem=new ArrayList();

您需要在每个链接上添加
@HalLink
。您忘记将其添加到
CityData.self

如果必须指定另一个名称,只需使用
name
属性即可

@HalLink(name = "ua:item")
private List<UaItem> uaItem = new ArrayList<UaItem>();
@HalLink(name=“ua:item”)
private List uaItem=new ArrayList();

我不再参与此项目,因此我无法检查此项目。我们最终使用了一个没有HAL符号的不同API。所以就把这个留给和我遇到同样问题的人来尝试一下。将暂时批准它,直到有人声明不这样做。它不起作用。您需要使用
@HalLink(name=“ua:item”)
。看看下面。
public class CityData implements HalResource {

    @HalLink
    private List<Cury> curies = new ArrayList<Cury>();
    private Self self;
    private List<UaItem> uaItem = new ArrayList<UaItem>();
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    private Integer count;

    //getters and setters
}
public class UaItem implements HalResource {
    @HalLink
    private String href;
    private String name;
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();
    //getters and setters
}
String city = response.body().getUaItem().get(0).getName();
@serializedName("ua:item") private List<UaItem> uaItem = new ArrayList<UaItem>();
@HalLink(name = "ua:item")
private List<UaItem> uaItem = new ArrayList<UaItem>();