首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Halarious和Teleport.org的改造

Halarious和Teleport.org的改造
EN

Stack Overflow用户
提问于 2016-04-04 10:25:39
回答 2查看 450关注 0票数 2

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

areas/

答复如下:

代码语言:javascript
复制
{
  "_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类中的信息。为了这个我选了哈拉利。http://halarious.ch/

我把它设成这样。

MainActivity:

代码语言:javascript
复制
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
        }
    });
}

HALConverterFactory.class:

代码语言:javascript
复制
public final class HALConverterFactory extends Converter.Factory {
    private final Gson gson;

    public static HALConverterFactory create(Class<?> type) {
        return new HALConverterFactory(type);
    }

    private HALConverterFactory(Class<?> type) {
        if (!HalResource.class.isAssignableFrom(type))
            throw new NullPointerException("Type should be a subclass of HalResource");
        GsonBuilder builder = new GsonBuilder();
        builder.registerTypeAdapter(HalResource.class, new HalSerializer());
        builder.registerTypeAdapter(HalResource.class, new HalDeserializer(type));
        builder.setExclusionStrategies(new HalExclusionStrategy());
        this.gson = builder.create();
    }

    @Override
    public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
        return new HALResponseBodyConverter<>(gson);
    }

    @Override
    public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
        return super.requestBodyConverter(type, parameterAnnotations, methodAnnotations, retrofit);
    }
}

HALResponseBodyConverter.class:

代码语言:javascript
复制
final class HALResponseBodyConverter<T extends HalResource> implements Converter<ResponseBody, T>{

    private final Gson gson;

    HALResponseBodyConverter(Gson gson) {
        this.gson = gson;
    }

    @Override public T convert(ResponseBody value) throws IOException {
        BufferedSource source = value.source();
        try {
            String s = source.readString(Charset.forName("UTF-8"));
            return (T) gson.fromJson(s, HalResource.class);
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            closeQuietly(source);
        }
    }

    private static void closeQuietly(Closeable closeable) {
        if (closeable == null) return;
        try {
            closeable.close();
        } catch (IOException ignored) {
        }
    }
}

我正在上下面的POJO课程。

CityData:

代码语言:javascript
复制
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
}

UaItem:

代码语言:javascript
复制
public class UaItem implements HalResource {
    @HalLink
    private String href;
    private String name;
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();
    //getters and setters
}

我现在要做的是检索以下内容:

代码语言:javascript
复制
String city = response.body().getUaItem().get(0).getName();

但问题是我的getUaItem完全是空的。它只是返回[]。所以get(0)是无用的,因为数组是空的。我可以得到计数,因为这是在最高水平,但UaItem给我带来了问题。为什么会这样呢?

致以亲切的问候,

沃特

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-19 09:27:51

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

代码语言:javascript
复制
@serializedName("ua:item") private List<UaItem> uaItem = new ArrayList<UaItem>();
票数 0
EN

Stack Overflow用户

发布于 2016-09-04 15:09:55

您需要在每个链接上添加@HalLink。你忘了把它添加到CityData.self

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

代码语言:javascript
复制
@HalLink(name = "ua:item")
private List<UaItem> uaItem = new ArrayList<UaItem>();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36400120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档