fastjson2 icon indicating copy to clipboard operation
fastjson2 copied to clipboard

[BUG] @JSONField with unwrapped on set/get

Open Cooperzzy opened this issue 1 year ago • 0 comments

问题描述

Fastjson中的@JSONField with unwrapped 异常,compared with fastjson2.

环境信息

  • 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.JSONPath;
import com.alibaba.fastjson2.annotation.JSONField;
import org.junit.jupiter.api.Test;

import java.util.HashMap;
import java.util.Map;

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

public class MutatedIssue897_44 {
    @Test
    public void test() {
        String json = "{\"name\": \"zhangsan\", \"age\": 18}";
        People p = JSON.parseObject(json, People.class);

        assertEquals("zhangsan", p.getName());
        assertEquals(18, p.getExtra().get("age"));

        JSONPath.set(p, "$.age", 20);
        assertEquals(20, p.getExtra().get("age"));
    }

    static class People {
        private String name;
        private Map<String, Object> extra = new HashMap<>();

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Map<String, Object> getExtra() {
            return extra;
        }

        public void setExtra(Map<String, Object> extra) {
            this.extra = extra;
        }

        @JSONField(unwrapped = true)
        public void set(String key, Object value) {
            this.extra.put(key, value);
        }

        @JSONField(unwrapped = true)
        public Object get(String key) {
            return this.extra.get(key);
        }
    }

    @Test
    public void testfj() {
        String json = "{\"name\": \"zhangsan\", \"age\": 18}";
        People1 p = com.alibaba.fastjson.JSON.parseObject(json, People1.class);

        assertEquals("zhangsan", p.getName());
        assertEquals(18, p.getExtra().get("age"));

        com.alibaba.fastjson.JSONPath.set(p, "$.age", 20);
        assertEquals(20, p.getExtra().get("age"));
    }

    static class People1 {
        private String name;
        private Map<String, Object> extra = new HashMap<>();

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Map<String, Object> getExtra() {
            return extra;
        }

        public void setExtra(Map<String, Object> extra) {
            this.extra = extra;
        }

        @com.alibaba.fastjson.annotation.JSONField(unwrapped = true)
        public void set(String key, Object value) {
            this.extra.put(key, value);
        }

        @com.alibaba.fastjson.annotation.JSONField(unwrapped = true)
        public Object get(String key) {
            return this.extra.get(key);
        }
    }

}

期待的正确结果

正常解析

相关日志输出

Expected :18 Actual :null

Cooperzzy avatar May 10 '24 01:05 Cooperzzy