[BUG] Inconsistency in JSON.parseObject
问题描述
基于#1487,在fastjson中无法解析,抛出异常。
环境信息
- OS信息: [MacOS 12.7.4 M1 Pro 16 GB]
- JDK信息: [Openjdk 17.0.6]
- 版本信息:[Fastjson 2.0.49/2.0.50-SNAPSHOT]
重现步骤
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import org.junit.jupiter.api.Test;
import java.nio.charset.StandardCharsets;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class MutatedTestIssue1487_357 {
@Test
public void mutatedTest() {
String str = "{'P1Q1': {1.0: 'option 1', 2.0: 'option 2', 3.0: 'option 3'}}";
JSONObject jsonObject = JSON.parseObject(str);
String expected = "{\"P1Q1\":{1.0:\"option 1\",2.0:\"option 2\",3.0:\"option 3\"}}";
assertEquals(expected, jsonObject.toJSONString());
assertEquals(expected, new String(JSON.toJSONBytes(jsonObject), StandardCharsets.UTF_8));
}
@Test
public void mutatedTestfj() {
String str = "{'P1Q1': {1.0: 'option 1', 2.0: 'option 2', 3.0: 'option 3'}}";
com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSON.parseObject(str);
String expected = "{\"P1Q1\":{1.0:\"option 1\",2.0:\"option 2\",3.0:\"option 3\"}}";
assertEquals(expected, jsonObject.toJSONString());
assertEquals(expected, new String(com.alibaba.fastjson.JSON.toJSONBytes(jsonObject), StandardCharsets.UTF_8));
}
}
期待的正确结果
正常解析
相关日志输出
com.alibaba.fastjson.JSONException: illegal input ., offset 12, character ., line 1, column 12, fastjson-version 2.0.50 {'P1Q1': {1.0: 'option 1', 2.0: 'option 2', 3.0: 'option 3'}} at com.alibaba.fastjson.JSON.parseObject(JSON.java:198) at issues_20230510.MutatedTestIssue1487_357.mutatedTestfj(MutatedTestIssue1487_357.java:25) Caused by: com.alibaba.fastjson2.JSONException: illegal input ., offset 12, character ., line 1, column 12, fastjson-version 2.0.50 {'P1Q1': {1.0: 'option 1', 2.0: 'option 2', 3.0: 'option 3'}} at com.alibaba.fastjson2.JSONReader.readObject(JSONReader.java:2287) at com.alibaba.fastjson2.JSONReader.read(JSONReader.java:2060) at com.alibaba.fastjson.JSON.parseObject(JSON.java:189
这种非标场景,不是fastjson 1.x 兼容API提升的方向,先不处理了