Jackson JSON - 使用不同的逻辑

时间:2018-03-30 10:41:33

标签: java json jackson

假设您有一个包含许多字段的对象A,其中一个字段是唯一标识此对象的id。在我的java代码中有一个对象B,它将这些对象保存在几个与此代码类似的数据结构中:

private List<A> all;
private Map<Long, A> mapped;

现在,当将B序列化为json时,我只希望列表all中的对象A与所有字段序列化,而映射mapped中的对象仅与id字段序列化。你会怎么做?

1 个答案:

答案 0 :(得分:1)

您可以实现StdConverter接口:

 var apiInterface: ApiInterface = ApiClient.getClient()!!.create(ApiInterface::class.java)
    var hero: Call<List<Hero>>
    hero = apiInterface.getData()
    hero.enqueue(object : Callback<List<Hero>> {
        override fun onFailure(call: Call<List<Hero>>?, t: Throwable?) {
            closeDialog(dialog)
            Toast.makeText(mContext, t?.message, Toast.LENGTH_SHORT).show()
            Log.d("Error:::",t?.message)
        }

        override fun onResponse(call: Call<List<Hero>>?, response: Response<List<Hero>>?) {
           mHeroDataList.clear()
            if (response != null && response.isSuccessful && response.body() != null) {
                closeDialog(dialog)
                mHeroDataList .addAll(response.body()!!)
                setAdapter(mHeroDataList)
            }
        }

    })

然后您可以将转换器添加为JsonSerialize注释:

public class YourConverter implements StdConverter<Map<Long, A>, Map<Long, String>> {
  @Override
  public Map<Long, String> convert(final Map<Long, A> inMap) {
    final HashMap<Long, String> outMap = new HashMap<>();
    inMap.forEach((k, v) -> outMap.put(k, v.getId()));
    return outMap;
    // Or as one-liner
    // return inMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().getId()));
  }
}