alibaba / fastjson2

🚄 FASTJSON2 is a Java JSON library with excellent performance.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[BUG] Abnormal syntaxError

Cooper-Zhong opened this issue · comments

问题描述

Based on #1269,以下的代码在Mac上使用fastjson2-2.0.49中正常运行,在cloned repository源码中报错。

环境信息

Environment of cloned source code:

  • OS信息: [Ubuntu 22.04.3 LTS (GNU/Linux 6.2.0-36-generic x86_64)]
  • JDK信息: [Openjdk 1.8.0_382]
  • 版本信息:[Fastjson2-2.0.50-SNAPSHOT] (perhaps?)

重现步骤

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.JSONWriter;
import org.json.JSONException;
import org.junit.jupiter.api.Test;
import org.skyscreamer.jsonassert.JSONAssert;

import java.util.HashMap;

import static org.junit.jupiter.api.Assertions.assertEquals;


public class Issue1269_Mutated_0 {
    @Test
    public void test() throws JSONException {
        HashMap<Integer, Integer> map = new HashMap<>();
        map.put(1, 1);
        map.put(2, 2);

        JavaObj o = new JavaObj(map);
        byte[] bt = JSON.toJSONBytes(o, JSONWriter.Feature.PrettyFormat); // changed from WriteNonStringKeyAsString to PrettyFormat
        JSONObject jsonObj = JSON.parseObject(bt);
        JSONAssert.assertEquals("{\"map\":{\"1\":1,\"2\":2}}", jsonObj.toString(), true);

        o = JSON.parseObject(bt, JavaObj.class); // changed from JSONReader.Feature.FieldBased to direct parsing
        assertEquals(1, o.getMap().get(1)); // changed to use direct parsing
    }

    static class JavaObj {
        HashMap<Integer, Integer> map = new HashMap<>();

        public JavaObj() {
        }

        public JavaObj(HashMap<Integer, Integer> map) {
            super();
            this.map = map;
        }

        public HashMap<Integer, Integer> getMap() {
            return map;
        }

        public void setMap(HashMap<Integer, Integer> map) {
            this.map = map;
        }
    }
}

期待的正确结果

相关日志输出

org.json.JSONException: Names must be strings, but 1 is of type java.lang.Integer at character 9 of {"map":{1:1,2:2}}
at org.json.JSONTokener.syntaxError(JSONTokener.java:450)
at org.json.JSONTokener.readObject(JSONTokener.java:367)
at org.json.JSONTokener.nextValue(JSONTokener.java:100)
at org.json.JSONTokener.readObject(JSONTokener.java:385)
at org.json.JSONTokener.nextValue(JSONTokener.java:100)
at org.json.JSONObject.(JSONObject.java:155)
at org.json.JSONObject.(JSONObject.java:172)
at org.skyscreamer.jsonassert.JSONParser.parseJSON(JSONParser.java:43)
at org.skyscreamer.jsonassert.JSONCompare.compareJSON(JSONCompare.java:50)
at org.skyscreamer.jsonassert.JSONCompare.compareJSON(JSONCompare.java:125)
at org.skyscreamer.jsonassert.JSONAssert.assertEquals(JSONAssert.java:415)
at org.skyscreamer.jsonassert.JSONAssert.assertEquals(JSONAssert.java:394)
at org.skyscreamer.jsonassert.JSONAssert.assertEquals(JSONAssert.java:336)
at com.alibaba.fastjson2.ours.pass.Issue1269_Mutated_0.test(Issue1269_Mutated_0.java:25)
at java.lang.reflect.Method.invoke(Method.java:498)
at java.util.ArrayList.forEach(ArrayList.java:1259)
at java.util.ArrayList.forEach(ArrayList.java:1259)

这个例子应该没有问题