fastjson JSONArray.toJavaList丢失Long的精度

lmvvr0a8  于 2022-11-02  发布在  Java
关注(0)|答案(1)|浏览(288)

下面是实体类

@Data
@Slf4j
public class LiveWaterVO implements Serializable {

  private String name;

  private Long level1;

  private Long level2;

  private Long level3;

  private Long wl;

  @JsonIgnoreProperties(ignoreUnknown = true)
  private Long wlSixHoursAgo;

  @JsonIgnoreProperties(ignoreUnknown = true)
  private Long wlThreeHoursAgo;

  @JsonIgnoreProperties(ignoreUnknown = true)
  private Long wlOneHourAgo;
}

Maven依赖:

<!-- lombok -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.22</version>
      <scope>provided</scope>
    </dependency>

    <!-- fastjson -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.79</version>
    </dependency>

  <!-- jackson -->
  <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.5</version>
  </dependency>

原来的JSON:

[{"wl":0.01,"name":"西桥","level1":"9","level3":"0.7","level2":"1.4"}]

进行下面的转换后:

List<LiveWaterVO> liveWaterVOS = jsonArray.toJavaList(LiveWaterVO.class);
log.info("{}", liveWaterVOS);

结果显示如下:

[LiveWaterVO(name=西桥, level1=9, level2=1, level3=0, wl=0, wlSixHoursAgo=null, wlThreeHoursAgo=null, wlOneHourAgo=null)]

这个Long的字段直接变成0了,经过debugger后发现关键代码在TypeUtils:

JavaBeanDeserializer javaBeanDeser = null;
ObjectDeserializer deserializer = config.getDeserializer(clazz);
if (deserializer instanceof JavaBeanDeserializer) {
    javaBeanDeser = (JavaBeanDeserializer) deserializer;
}

if (javaBeanDeser == null) {
    throw new JSONException("can not get javaBeanDeserializer. " + clazz.getName());
}
return (T) javaBeanDeser.createInstance(map, config);

难道我要定义一个Deserializer吗?

fkaflof6

fkaflof61#

The log doesn't show Long value because the previous json input is Float value rather than Long value

相关问题