Json 将Gson LinkedTreeMap改装为自定义对象

Json 将Gson LinkedTreeMap改装为自定义对象,json,gson,retrofit,Json,Gson,Retrofit,我有以下JSON文件: 编辑:如果上述链接不起作用: 目前为止,我发现获取此JSON的唯一可能性是使用映射: Call<Map<String, Object>> call = liveApi.loadProductList(request.categoryId, request.sort, request.lazyLoading) call.enqueue(new Callback<Map<String, Object>>() { @O

我有以下JSON文件:

编辑:如果上述链接不起作用:

目前为止,我发现获取此JSON的唯一可能性是使用映射:

Call<Map<String, Object>> call = liveApi.loadProductList(request.categoryId, request.sort, request.lazyLoading)

call.enqueue(new Callback<Map<String, Object>>() {
    @Override
    public void onResponse(Call<Map<String, Object>> call, Response<Map<String, Object>> response) {
        Call<Map<String, Object> map = response.body();
    }
});
Call Call=liveApi.loadProductList(request.categoryId、request.sort、request.lazyLoading)
call.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){

Call您所要做的就是创建自定义映射。由于您的JSON文档非常复杂,您可以尝试自动映射生成器,但如果它们因任何原因(动态属性、多态值、不正确的命名检测等)失败,您始终可以创建自定义映射:

最终课堂反应{
@SerializedName(“类别”)最终列表类别=空;
@SerializedName(“facettes”)最终列表facettes=null;
@SerializedName(“productlistentries”)最终列表productlistentries=null;
@SerializedName(“last”)最终布尔值isLast=boolean.valueOf(false);
}
期末班类别{
@SerializedName(“金额”)最终整数金额=整数。valueOf(0);
}
最后一节课{
// ???
}
最终类产品{
@SerializedName(“名称”)最终字符串名称=null;
@SerializedName(“modelNumber”)最终整数modelNumber=Integer.valueOf(0);
@SerializedName(“brandLogo”)最终字符串brandLogo=null;
@SerializedName(“detailLink”)最终字符串detailLink=null;
@SerializedName(“联机”)最终布尔值isOnline=boolean.valueOf(false);
@SerializedName(“imageURL”)最终字符串imageURL=null;
@SerializedName(“AddToBaseTurl”)最终字符串AddToBaseTurl=null;
@SerializedName(“评级”)最终整数评级=整数。valueOf(0);
@SerializedName(“ratingCount”)最终整数ratingCount=Integer.valueOf(0);
@SerializedName(“功能”)最终列表功能=空;
@SerializedName(“价格”)最终字符串价格=null;
@SerializedName(“vatLabel”)最终字符串vatLabel=null;
@SerializedName(“费用”)最终列表费用=null;
@SerializedName(“gtm”)最终gtm gtm=null;
@SerializedName(“productComparison”)最终productComparison productComparison=null;
@SerializedName(“productWishlist”)最终productWishlist productWishlist=null;
@SerializedName(“clubProduct”)最终布尔值isClubProduct=boolean.valueOf(false);
@SerializedName(“onlineOnlyProduct”)最终布尔值isOnlineOnlyProduct=boolean.valueOf(false);
}
最后一类功能{
@SerializedName(“key”)最终字符串key=null;
@SerializedName(“值”)最终字符串值=null;
}
期末学费{
@SerializedName(“值”)最终字符串值=null;
@SerializedName(“dataLayer”)最终字符串dataLayer=null;
}
最后一级Gtm{
@SerializedName(“名称”)最终字符串名称=null;
@SerializedName(“id”)最终字符串id=null;
@SerializedName(“价格”)最终字符串价格=null;
@SerializedName(“品牌”)最终字符串brand=null;
@SerializedName(“类别”)最终字符串类别=null;
@SerializedName(“dimension9”)最终字符串dimension9=null;
@SerializedName(“dimension10”)最终字符串dimension10=null;
}
期末成绩比较{
@SerializedName(“dataLayer”)最终字符串dataLayer=null;
@SerializedName(“dataUrl”)最终字符串dataUrl=null;
@SerializedName(“文本”)最终字符串text=null;
@SerializedName(“additionalClasses”)最终字符串additionalClasses=null;
}
最终类ProductWishlist{
@SerializedName(“requestUrl”)最终字符串requestUrl=null;
@SerializedName(“文本”)最终字符串text=null;
}
手工编写映射花了大约15分钟,因此它们可能有错误或打字错误。请注意,我假设您的响应是只读的,不应该手动创建以发送到其他地方,因此所有字段都声明为
final
。关于基元字段的一条备注:如果您使用
0
false
,那么Java编译器就可以内联编译时常量,所以
Type.value(…)
是一种欺骗,让javac认为它是一个不能内联的运行时值。(您可能希望生成getter,但简单数据包的IMHO字段更容易使用,并且添加的噪音更少)

您只需将
Call
更改为
Call

vanilla Java中的示例,不是改装:

try(final Reader=getPackageResourceReader(Q43535942.class,“response.json”)){
最终响应Response=gson.fromJson(reader,Response.class);
System.out.println(response.productListEntries.get(1.get(“3486143”).imageUrl);
}
输出:

//picscdn.redblue.de/doi/pixelboxx-mss-70874441/mobile_220_310_png/CRUNCH-GTO-4125-Verst%C3%A4rker-%28Class-D%29


上面的链接已断开。你能发布JSON文档吗?我尝试了两个不同网络的链接,它对我有用。我会粘贴它。我们认为刚才添加了一个pastebin链接。你尝试过自动映射生成器吗?在JSON设计不太好的情况下,它可能会失败,但值得一试。不,我没有。谢谢你的提示,我会尝试一下。我做得很有魅力,我错过了一门课