为了账号安全,请及时绑定邮箱和手机立即绑定

通用 ResponseTo<T> 作为 Json

通用 ResponseTo<T> 作为 Json

茅侃侃 2023-06-04 17:29:03
我正在努力反序列化JSON由通用结果结构包装的对象:我JSON从服务器:{  "totalsize": 5,  "data" : [             {"name":1},             {"name":2}           ]}我的Java结果对象:public class ResponseTo<T> {    public Long totalsize = null;    public final List<T> data = new ArrayList<>();}在这种情况下(可以是另一个 GET 请求中的任何其他内容)public class Item {    public int name;}在这种情况下T是一个Item.如何使用以下方法将有效负载JSON反序列化到此对象结构中:GSON和/或com.fasterxml.jackson?我想要一个静态方法,例如:public static <T> ResponseTo<T> stringToObject(String jsonString, Class<T> clazz ) {    final Gson gson = new Gson();    // do some typeadapter function magic    return gson.fromJson( jsonString, ResponseTo.class );}它被调用ResponseTo<Item> responseTo = stringToObject( <json-string>, Item.class );我只接收com.google.gson.internal.LinkedTreeMap数据对象。我该怎么做才能让它发挥作用?- 我做错了吗?
查看完整描述

3 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

您需要使用类型标记来处理泛型情况,因为类型信息将T被 Java 编译器删除,Gson 不知道要恢复T到什么类型。

Type typeToken = new TypeToken<ResponseTo<Item>>() { }.getType();
ResponseTo<Item> responseTo = stringToObject( <json-string>, typeToken );


查看完整回答
反对 回复 2023-06-04
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

如果您在对象中有类型鉴别器(即每个示例中具有唯一值的公共字段),那么 Jackson@JsonTypeInfo(JsonTypeInfo.As.EXISTING_PROPERTY...)将允许您定义查找位置,并且初始化可以预先注册所有可能的类ObjectMapper.registerSubtypes(Item.class)。然后杰克逊会选择正确的那个。

如果要实例化哪种类型的规则比“在字段 X 中查找”更复杂,那么您必须编写自己的规则@JsonTypeResolver来实现所述逻辑(非平凡)。


查看完整回答
反对 回复 2023-06-04
?
墨色风雨

TA贡献1853条经验 获得超6个赞

格森

您可以使用内部com.google.gson.internal.$Gson$Types类来实现这一点:


import com.google.gson.Gson;

import com.google.gson.internal.$Gson$Types;


import java.lang.reflect.ParameterizedType;

import java.util.ArrayList;

import java.util.List;


public class GsonApp {


    public static void main(String[] args) {

        String json = "{\n" +

                "  \"totalsize\": 5,\n" +

                "  \"data\": [\n" +

                "    {\n" +

                "      \"name\": 1\n" +

                "    },\n" +

                "    {\n" +

                "      \"name\": 2\n" +

                "    }\n" +

                "  ]\n" +

                "}\n";


        System.out.println(stringToObject(json, Item.class));

    }


    static <T> ResponseTo<T> stringToObject(String jsonString, Class<T> clazz) {

        final Gson gson = new Gson();

        // do some typeadapter function magic

        ParameterizedType parameterizedType = $Gson$Types.newParameterizedTypeWithOwner(ResponseTo.class, ResponseTo.class, clazz);

        return gson.fromJson(jsonString, parameterizedType);

    }

}


class ResponseTo<T> {


    public Long totalsize = null;

    public final List<T> data = new ArrayList<>();


    @Override

    public String toString() {

        return "ResponseTo{" +

                "totalsize=" + totalsize +

                ", data=" + data +

                '}';

    }

}


class Item {

    public int name;


    @Override

    public String toString() {

        return "Item{" +

                "name=" + name +

                '}';

    }

}

上面的代码打印:


ResponseTo{totalsize=5, data=[Item{name=1}, Item{name=2}]}

杰克逊

在Jackson你可以做类似的方法:


import com.fasterxml.jackson.databind.JavaType;

import com.fasterxml.jackson.databind.ObjectMapper;


import java.io.IOException;


public class JsonApp {


    public static void main(String[] args) throws Exception {

        String json = "{\n" +

                "  \"totalsize\": 5,\n" +

                "  \"data\": [\n" +

                "    {\n" +

                "      \"name\": 1\n" +

                "    },\n" +

                "    {\n" +

                "      \"name\": 2\n" +

                "    }\n" +

                "  ]\n" +

                "}\n";


        System.out.println(stringToObject(json, Item.class));

    }


    static <T> ResponseTo<T> stringToObject(String jsonString, Class<T> clazz) throws IOException {

        ObjectMapper mapper = new ObjectMapper();

        // do some typeadapter function magic

        JavaType responseType = mapper.getTypeFactory().constructParametricType(ResponseTo.class, clazz);

        return mapper.readValue(jsonString, responseType);

    }

}


查看完整回答
反对 回复 2023-06-04
  • 3 回答
  • 0 关注
  • 171 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信