java readvalue_详解 Jackson 中的 ObjectMapper 类中的 readValue 方法对泛型的处理

@Test

public void test(){

Json userJson = new Json<>();

Hit hit = new Hit<>();

hit.setId("1");

hit.setData(new User(20, "jack"));

Hits userHits = new Hits<>();

userHits.setFound(1);

userHits.setStart(2);

ArrayList> hitArrayList = new ArrayList<>();

hitArrayList.add(hit);

userHits.setHit(hitArrayList);

userJson.setHits(userHits);

try {

String userJsonString = JsonUtils.getMapper().writerWithDefaultPrettyPrinter().writeValueAsString(userJson);

System.out.println(String.format("hit to jsonString:\n%s", userJsonString));

Json readValue = JsonUtils.getMapper().readValue(userJsonString, new TypeReference>(){});

System.out.println(readValue.getHits().getFound());

userJsonString = JsonUtils.getMapper().writeValueAsString(readValue);

System.out.println(String.format("hit to jsonString:\n%s", userJsonString));

} catch (Exception e) {

e.printStackTrace();

}

}

@Test

public void test2(){

String jsonString = "{\"hits\":{\"found\":1,\"start\":2,\"hit\":[{\"id\":\"1\",\"data\":{\"age\":20,\"name\":\"jack\",\"enName\":null,\"password\":null,\"gender\":\"\\u0000\",\"hasMarried\":false}}]}}";

try {

// 通过 new TypeReference>(){} 来解决泛型问题

Json readValue = JsonUtils.getMapper().readValue(jsonString, new TypeReference>(){});

System.out.println(readValue.getHits().getFound());

// 通过 TypeFactory 来解决泛型问题

JavaType jsonType = JsonUtils.getMapper().getTypeFactory().constructParametricType(Json.class, User.class);

readValue = JsonUtils.getMapper().readValue(jsonString, jsonType);

System.out.println(readValue.getHits().getFound());

} catch (Exception e) {

e.printStackTrace();

}

}

@Test

public void test3(){

String jsonString = "{\"data\":{\"hits\":{\"found\":1,\"start\":2,\"hit\":[{\"id\":\"1\",\"data\":{\"age\":20,\"name\":\"jack\",\"enName\":null,\"password\":null,\"gender\":\"\\u0000\",\"hasMarried\":false}}]}},\"sign\":\"success\",\"code\":200,\"message\":null,\"dataSize\":1}";

try {

// 通过 new TypeReference>(){} 来解决泛型问题

HttpResponse> httpResponse = JsonUtils.getMapper().readValue(jsonString, new TypeReference>>(){});

System.out.println(httpResponse.getData().getHits().getFound());

// 通过 TypeFactory 来解决泛型问题

JavaType jsonType = JsonUtils.getMapper().getTypeFactory().constructParametricType(Json.class, User.class);

JavaType httpResponseJavaType = JsonUtils.getMapper().getTypeFactory().constructParametricType(HttpResponse.class, jsonType);

HttpResponse> parseHttpResponse = JsonUtils.getMapper().readValue(jsonString, httpResponseJavaType);

System.out.println(parseHttpResponse.getData().getHits().getFound());

} catch (Exception e) {

e.printStackTrace();

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果发送的消息含有泛型类型,可以使用TypeReference类来解决序列化和反序列化时的类型擦除问题。TypeReference是Jackson的一个类,可以获取泛型的实际类型,从而正确地序列化和反序列化对象。 下面是一个示例代码: ```java import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; @Component public class KafkaProducer { @Autowired private KafkaTemplate<String, String> kafkaTemplate; @Autowired private ObjectMapper objectMapper; public void sendMessage(String topic, Message<T> message) throws JsonProcessingException { String json = objectMapper.writeValueAsString(message); TypeReference<Message<T>> typeReference = new TypeReference<Message<T>>() {}; Message<T> actualMessage = objectMapper.readValue(json, typeReference); kafkaTemplate.send(topic, json); } } ``` 在上面的代码,使用ObjectMapper来序列化和反序列化消息对象。在发送消息时,先将Message对象序列化成JSON格式的字符串,然后使用TypeReference来指定反序列化时的实际类型。最后,使用KafkaTemplate发送序列化后的JSON字符串到指定的Topic。 需要注意的是,如果泛型的实际类型是自定义的类,需要保证该类在序列化和反序列化时都可以正确地处理。如果需要在不同的应用程序之间共享自定义类,建议使用Avro或Protobuf等序列化框架。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值