alibaba / alibaba/fastjson2

json字符串反序列化成对象不对

Open
#3,786 1 comment 0 reactions 0 assignees View on GitHub
question
Dominant language
Java
Stars
4.4k
Forks
613
Avg merge
1d 22h
Merged PRs (30d)
6

Description

```@Data
@TableName("slt_error_tag")
public class SltErrorTag {

/**
* 空间id
*/
private String topTeamId;
/**
* 场景id
*/
private String scenesId;
/**
* 任务id
*/
private String taskUuid;

/**
* 发布账号id
*/
private String uid;

/**
* 作品id
*/
private String awemeId;

/**
* 平台
*/
private Integer plat;

/**
* 0代表账号,1代表作品
*/
private Integer tag;

/**
* 分区
*/
private String ds;

/**
* 数据插入时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date insertTime;

/**
* atsp任务id
*/
private String atspId;

@TableField(exist = false)
private String publicTime;

private Integer type;

public static void main(String[] args) {
JSONObject parsed = JSONObject.parseObject("{\n" +
" \"errorDataList\" : [ {\n" +
" \"atspId\" : \"4o2clxdxwwvjwwav68c78f8f0000000000090ce6\",\n" +
" \"awemeId\" : \"5209024857377962\",\n" +
" \"ds\" : \"20250916\",\n" +
" \"insertTime\" : \"2025-09-16 17:22:45.817\",\n" +
" \"plat\" : 5,\n" +
" \"publicTime\" : \"2025-09-09 17:56:08\",\n" +
" \"scenesId\" : \"b523777bfad94dc39d9f53ba323a0211\",\n" +
" \"tag\" : 1,\n" +
" \"taskUuid\" : \"d01642016fcc4659a216fdba49402131\",\n" +
" \"topTeamId\" : \"88EF2552DC7F4D59BA1E83D7A219E183\",\n" +
" \"type\" : 1,\n" +
" \"uid\" : \"7671894481\"\n" +
" }, {\n" +
" \"atspId\" : \"4o2clxdxwwvjwwav68c78f8f0000000000090ce6\",\n" +
" \"ds\" : \"20250916\",\n" +
" \"insertTime\" : \"2025-09-16 17:22:45.817\",\n" +
" \"plat\" : 5,\n" +
" \"scenesId\" : \"b523777bfad94dc39d9f53ba323a0211\",\n" +
" \"tag\" : 0,\n" +
" \"taskUuid\" : \"d01642016fcc4659a216fdba49402131\",\n" +
" \"topTeamId\" : \"88EF2552DC7F4D59BA1E83D7A219E183\",\n" +
" \"type\" : 1,\n" +
" \"uid\" : \"7671894481\"\n" +
" } ],\n" +
" \"dwsAwemeV2List\" : [ ],\n" +
" \"dwsAccountV2List\" : [ ],\n" +
" \"dwdAwemeV2\" : [ ]\n" +
"}");
List errorDataList = parsed.getJSONArray("errorDataList").toJavaList(SltErrorTag.class);

System.out.println(errorDataList);
}}```
我这个主方法执行的时候报错【Exception in thread "main" 已与地址为 ''127.0.0.1:53423',传输: '套接字'' 的目标虚拟机断开连接
java.lang.NumberFormatException: For input string: "7671894481"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)】、然后我一路debug看源码,发现在一个叫 `ObjectReader12`类的里面的 getFieldReader 方法好像不太对。它具体如下:```package com.alibaba.fastjson2.reader;

import com.alibaba.fastjson2.schema.JSONSchema;

import java.util.function.Function;
import java.util.function.Supplier;

public class ObjectReader12
extends ObjectReaderAdapter {
protected final FieldReader fieldReader0;
protected final FieldReader fieldReader1;
protected final FieldReader fieldReader2;
protected final FieldReader fieldReader3;
protected final FieldReader fieldReader4;
protected final FieldReader fieldReader5;
protected final FieldReader fieldReader6;
protected final FieldReader fieldReader7;
protected final FieldReader fieldReader8;
protected final FieldReader fieldReader9;
protected final FieldReader fieldReader10;
protected final FieldReader fieldReader11;

final long hashCode0;
final long hashCode1;
final long hashCode2;
final long hashCode3;
final long hashCode4;
final long hashCode5;
final long hashCode6;
final long hashCode7;
final long hashCode8;
final long hashCode9;
final long hashCode10;
final long hashCode11;

final long hashCode0LCase;
final long hashCode1LCase;
final long hashCode2LCase;
final long hashCode3LCase;
final long hashCode4LCase;
final long hashCode5LCase;
final long hashCode6LCase;
final long hashCode7LCase;
final long hashCode8LCase;
final long hashCode9LCase;
final long hashCode10LCase;
final long hashCode11LCase;

protected ObjectReader objectReader0;
protected ObjectReader objectReader1;
protected ObjectReader objectReader2;
protected ObjectReader objectReader3;
protected ObjectReader objectReader4;
protected ObjectReader objectReader5;
protected ObjectReader objectReader6;
protected ObjectReader objectReader7;
protected ObjectReader objectReader8;
protected ObjectReader objectReader9;
protected ObjectReader objectReader10;
protected ObjectReader objectReader11;

public ObjectReader12(
Class objectClass,
String typeKey,
String typeName,
long features,
JSONSchema schema,
Supplier creator,
Function buildFunction,
FieldReader... fieldReaders
) {
super(objectClass, typeKey, typeName, features, schema, creator, buildFunction, fieldReaders);

this.fieldReader0 = fieldReaders[0];
this.fieldReader1 = fieldReaders[1];
this.fieldReader2 = fieldReaders[2];
this.fieldReader3 = fieldReaders[3];
this.fieldReader4 = fieldReaders[4];
this.fieldReader5 = fieldReaders[5];
this.fieldReader6 = fieldReaders[6];
this.fieldReader7 = fieldReaders[7];
this.fieldReader8 = fieldReaders[8];
this.fieldReader9 = fieldReaders[9];
this.fieldReader10 = fieldReaders[10];
this.fieldReader11 = fieldReaders[11];

this.hashCode0 = fieldReader0.fieldNameHash;
this.hashCode1 = fieldReader1.fieldNameHash;
this.hashCode2 = fieldReader2.fieldNameHash;
this.hashCode3 = fieldReader3.fieldNameHash;
this.hashCode4 = fieldReader4.fieldNameHash;
this.hashCode5 = fieldReader5.fieldNameHash;
this.hashCode6 = fieldReader6.fieldNameHash;
this.hashCode7 = fieldReader7.fieldNameHash;
this.hashCode8 = fieldReader8.fieldNameHash;
this.hashCode9 = fieldReader9.fieldNameHash;
this.hashCode10 = fieldReader10.fieldNameHash;
this.hashCode11 = fieldReader11.fieldNameHash;

this.hashCode0LCase = fieldReader0.fieldNameHashLCase;
this.hashCode1LCase = fieldReader1.fieldNameHashLCase;
this.hashCode2LCase = fieldReader2.fieldNameHashLCase;
this.hashCode3LCase = fieldReader3.fieldNameHashLCase;
this.hashCode4LCase = fieldReader4.fieldNameHashLCase;
this.hashCode5LCase = fieldReader5.fieldNameHashLCase;
this.hashCode6LCase = fieldReader6.fieldNameHashLCase;
this.hashCode7LCase = fieldReader7.fieldNameHashLCase;
this.hashCode8LCase = fieldReader8.fieldNameHashLCase;
this.hashCode9LCase = fieldReader9.fieldNameHashLCase;
this.hashCode10LCase = fieldReader10.fieldNameHashLCase;
this.hashCode11LCase = fieldReader11.fieldNameHashLCase;
}

@Override
public FieldReader getFieldReader(long hashCode) {
if (hashCode == hashCode0) {
return fieldReader0;
}

if (hashCode == hashCode1) {
return fieldReader1;
}

if (hashCode == hashCode2) {
return fieldReader2;
}

if (hashCode == hashCode3) {
return fieldReader3;
}

if (hashCode == hashCode4) {
return fieldReader4;
}

if (hashCode == hashCode5) {
return fieldReader5;
}

if (hashCode == hashCode6) {
return fieldReader6;
}

if (hashCode == hashCode7) {
return fieldReader7;
}

if (hashCode == hashCode8) {
return fieldReader8;
}

if (hashCode == hashCode9) {
return fieldReader9;
}

if (hashCode == hashCode10) {
return fieldReader10;
}

if (hashCode == hashCode11) {
return fieldReader10;
}

return null;
}

@Override
public FieldReader getFieldReaderLCase(long hashCode) {
if (hashCode == hashCode0LCase) {
return fieldReader0;
}

if (hashCode == hashCode1LCase) {
return fieldReader1;
}

if (hashCode == hashCode2LCase) {
return fieldReader2;
}

if (hashCode == hashCode3LCase) {
return fieldReader3;
}

if (hashCode == hashCode4LCase) {
return fieldReader4;
}

if (hashCode == hashCode5LCase) {
return fieldReader5;
}

if (hashCode == hashCode6LCase) {
return fieldReader6;
}

if (hashCode == hashCode7LCase) {
return fieldReader7;
}

if (hashCode == hashCode8LCase) {
return fieldReader8;
}

if (hashCode == hashCode9LCase) {
return fieldReader9;
}

if (hashCode == hashCode10LCase) {
return fieldReader10;
}

if (hashCode == hashCode11LCase) {
return fieldReader11;
}

return null;
}
}
``` 这个地方的【 if (hashCode == hashCode10) {
return fieldReader10;
}

if (hashCode == hashCode11) {
return fieldReader10;
}】hashCode10和hashCode11返回的是同一个 fieldReader10 这是为什么呢。这是bug还是我的使用方式不对

Contributor guide

Open the contributing guide

Research direction

Start in com.alibaba.fastjson2.reader.ObjectReader12.getFieldReader(long) and reproduce the issue with the provided SltErrorTag JSON, especially the uid field. Compare the hashCode10 and hashCode11 branches with getFieldReaderLCase; done means each hash selects its corresponding FieldReader and the regression case deserializes without the reported NumberFormatException.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
backend
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.