TypeReference指定反序列化获取响应对象

前言

在代码开发过程中,调用起三方的接口获取数据。但是总会有一些其他原因导致接口调用不成功,影响整体的接口效率。一般我们都是自己创建一个相同结构的对象去接收。如果接口地址存在差异,构造方法缺失,接收对象不对都会导致失败。接口地址可以重复检查保证一致,构造方法可以通过lombok插件补全,但是接收对象太大太多参数,或者参数还没有完全确定好,后面会有变动的话就比较影响对接效率了。

我们可以通过TypeReference指定反序列化的类型。通过调用接口,用String来接收响应数据,然后简单判断接口是否成功,这样就不需要去关心响应对象差异的问题了。

也就是StringList<Object>

也可以转 Map<String, Object>Object…直接将 TypeReference 指定的类型替换一下就好了。

正文

示例
String str = EntityUtils.toString(response.getEntity());
JSONObject json_test = JSONObject.parseObject(str);
JSONArray dateArray = json_test.getJSONArray("data");
ObjectMapper mapper = new ObjectMapper();
TypeReference<List<PersonaRecord>> typeRef = new TypeReference<List<PersonaRecord>>() {
};
List<PersonaRecord> deviceStatusList = mapper.readValue(dateArray.toJSONString(), typeRef);
导包错误导致问题

image-20240614114554466

导入的包是这个

image-20240614113118320

重新导入包:

image-20240620151804892

全部代码:

image-20240620151840682

package rcts.shine.push.infrastructure.utils;

import com.alibaba.fastjson2.JSONArray;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import rcts.shine.push.infrastructure.db.entity.export.PersonaRecord;

import java.util.ArrayList;
import java.util.List;

/**
 * @author shiner
 * @date 2024/6/14
 */

@Slf4j
@Component
public class JsonUtil {

    public static void main(String[] args) {
        testTypeReference();
    }

    public static void testTypeReference() {
        List<PersonaRecord> list = new ArrayList<>();
        PersonaRecord record = new PersonaRecord();
        record.setUserId("231423432535");
        record.setUserPhone("13326653344");
        record.setIdentifyId("f44tjnd@hgoi0");
        list.add(record);
        list.add(record);
        list.add(record);

        String jsonString = JSONArray.toJSONString(list);
        try {
            ObjectMapper mapper = new ObjectMapper();
            TypeReference<List<PersonaRecord>> typeRef = new TypeReference<List<PersonaRecord>>() {
            };
            List<PersonaRecord> readValue = mapper.readValue(jsonString, typeRef);
            System.out.println(readValue);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }
}
输出结果:

image-20240620151950360

String转Map or 对象
Map<String, Object> model1 = JSONObject.parseObject(JSONObject.toJSONString(request), new TypeReference<Map<String, Object>>(){});

PrintData model2 = JSONObject.parseObject(JSONObject.toJSONString(request), new TypeReference<PrintData>(){});

结尾

tips:可以将TypeReference类型指定然后抽离出来,把testTypeReference()变成一个工具方法。重复使用而不是一直造轮子。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值