Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
告诉改型到哪个变量应该映射到某个json字段?_Json_Gson_Retrofit - Fatal编程技术网

告诉改型到哪个变量应该映射到某个json字段?

告诉改型到哪个变量应该映射到某个json字段?,json,gson,retrofit,Json,Gson,Retrofit,我正在谈论的REST API正在响应结构中的一些请求,例如: { "_links": { "next": "NEXT_DATA_BLOCK_URL", "prev": "PREV_DATA_BLOCK_URL", "self": "CURRENT_DATA_BLOCK_URL" }, "RESPONSE_DATA_NAME": [ { ... DATA_FIELDS ... } ] } 其中“RESPONSE\u DATA\u

我正在谈论的REST API正在响应结构中的一些请求,例如:

{
  "_links": {
    "next": "NEXT_DATA_BLOCK_URL",
    "prev": "PREV_DATA_BLOCK_URL",
    "self": "CURRENT_DATA_BLOCK_URL"
  },
  "RESPONSE_DATA_NAME": [
    {
      ... DATA_FIELDS ...
    }
  ]
}
其中“RESPONSE\u DATA\u NAME”是数据“NAME”-根据所需请求进行更改。例如,它可能是“团队”或“消息”

因此,我创建了一个具有以下成员的泛型类:

public class PagedResponse<T> {
  public PagingLinks _links;
  public List<T> _data;
}
公共类页面响应{
公共分页链接_链接;
公共列表数据;
}
是否有任何方法可以设置我的RestAdapter,使其始终将“RESPONSE\u DATA\u NAME”映射到“\u DATA”成员,而不管字段名实际上是什么


谢谢^ ^

使用gson,您可以用
@SerializedName
注释您的数据字段。此批注的参数(值)是序列化和反序列化对象时要使用的名称。例如,Java字段data在JSON中表示为
RESPONSE\u data\u NAME

public class PagedResponse<T> {

    public PagingLinks _links;
    @SerializedName(value="RESPONSE_DATA_NAME")
    public List<T> _data;
}

所以我终于找到了解决问题的办法

我创建了一个costude反序列化程序,它将
数据
字段添加到现有的
JsonObject
,并复制
响应数据名
(这是一个
JsonArray
)的内容。 然后我使用GSON简单转换(
GSON.fromJson()
)将其正常序列化

这有点愚蠢,但它能起作用

反序列化程序的类:

public class PagedResponseDeserializer implements JsonDeserializer<PagedResponse> {

    @Override
    public PagedResponse deserialize(JsonElement json, Type typeOfT,
            JsonDeserializationContext context) throws JsonParseException {

        Gson gson = new Gson();
        JsonElement value = null;
        JsonObject jsonObject = json.getAsJsonObject();     

        Iterable<Entry<String,JsonElement>> entries = jsonObject.entrySet();
        for (Entry<String, JsonElement> entry : entries) {
            value = entry.getValue();
            if (value.isJsonArray()) break;
        }

        jsonObject.add("data", value);

        return gson.fromJson(jsonObject, typeOfT);      
    }
}
公共类PagedResponseDeserializer实现JsonDeserializer{
@凌驾
公共页面响应反序列化(JsonElement json,键入typeOfT,
JsonDeserializationContext)抛出JsonParseException{
Gson Gson=新的Gson();
JsonElement值=null;
JsonObject JsonObject=json.getAsJsonObject();
Iterable entries=jsonObject.entrySet();
对于(条目:条目){
value=entry.getValue();
if(value.isJsonArray())中断;
}
jsonObject.add(“数据”,值);
返回gson.fromJson(jsonObject,typeOfT);
}
}

问题在于字段名称根据请求而变化(一个请求可以是“团队”,另一个请求可以是“消息”)。因此,这不是我问题的解决方案。如果我可以在'\u data'变量上多次使用此注释,我可以处理,但不幸的是这不可能。。。还有其他建议吗=/然后你可以编写自定义序列化程序和反序列化程序,你可以控制你的手我希望避免这种情况,因为我有点懒。。。那么我想我别无选择了。。。无论如何谢谢你!好的,我今天测试了您更新的解决方案,不幸的是,我仍然有一个问题-“数据”成员的类型是gson.internal.LinkedTreeMap而不是List。。。
 GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(PagedResponse.class, new CustomDeserializer());
Gson gson = gsonBuilder.create();

gson.fromJson(Your_JSON_STRING_HERE, PagedResponse.class);
public class PagedResponseDeserializer implements JsonDeserializer<PagedResponse> {

    @Override
    public PagedResponse deserialize(JsonElement json, Type typeOfT,
            JsonDeserializationContext context) throws JsonParseException {

        Gson gson = new Gson();
        JsonElement value = null;
        JsonObject jsonObject = json.getAsJsonObject();     

        Iterable<Entry<String,JsonElement>> entries = jsonObject.entrySet();
        for (Entry<String, JsonElement> entry : entries) {
            value = entry.getValue();
            if (value.isJsonArray()) break;
        }

        jsonObject.add("data", value);

        return gson.fromJson(jsonObject, typeOfT);      
    }
}