IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 开发技术-JSON.toJSONString出现{“$ref“:“$[0]“} -> 正文阅读

[移动开发]开发技术-JSON.toJSONString出现{“$ref“:“$[0]“}


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;


public class RefFastJson {

    public static void main(String[] args) {
        // 模拟返回的数据
        String str = "{\n" +
                "    \"code\": 200,\n" +
                "    \"data\": {\n" +
                "        \"users\": [\n" +
                "            {\n" +
                "                \"name\": \"死灵\",\n" +
                "                \"sex\": \"男\",\n" +
                "                \"age\": 18\n" +
                "            },\n" +
                "            {\n" +
                "                \"name\": \"骷髅\",\n" +
                "                \"sex\": \"男\",\n" +
                "                \"age\": 20\n" +
                "            },\n" +
                "            {\n" +
                "                \"name\": \"小黑\",\n" +
                "                \"sex\": \"女\",\n" +
                "                \"age\": 38\n" +
                "            }\n" +
                "        ]\n" +
                "    },\n" +
                "    \"msg\": \"操作成功\"\n" +
                "}";

        // 开始使用 JSONObject 处理数据
        JSONObject jsonObject = JSONObject.parseObject(str);
        JSONObject data = jsonObject.getJSONObject("data");

        String users = data.getString("users");
        List<TUser> userList = JSONObject.parseArray(users, TUser.class);
        ArrayList<HashMap<String, Object>> list = new ArrayList<>();

        // TODO 此为情况1,即 HashMap 创建在循环外面
        HashMap<String, Object> hashMap = new HashMap<>();

        userList.forEach((user) -> {
            // TODO 此为情况2,即 HashMap 创建在循环里面
//            HashMap<String, Object> hashMap = new HashMap<>();
            hashMap.put("name", user.getName());
            hashMap.put("sex", user.getSex());
            hashMap.put("age", user.getAge());
            list.add(hashMap);
        });

        System.out.println("list---" + list);
        System.out.println("处理前---" + JSON.toJSONString(list));


    }
}


class TUser {
    private String name;
    private String sex;
    private int age;

    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

输出结果

list---[{sex=女, name=小黑, age=38}, {sex=女, name=小黑, age=38}, {sex=女, name=小黑, age=38}]
处理前---[{"sex":"女","name":"小黑","age":38},{"$ref":"$[0]"},{"$ref":"$[0]"}]

发现

bug1-list 中的元素都是同一个对象

bug2-JSON.toJSONString(list) 输出的是{"$ref":"$[0]"}

先看bug2,这是 fastjson 支持循环引用引起的(因为 list 中的3元素都一样)

看中文文档中:Fastjson 循环引用_w3cschool

?提供了两种解决方法?

1、全局配置关闭,即创建一个配置类

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.springframework.context.annotation.Configuration;


@Configuration
public class FastJsonConfig {
    static {
        //全局配置关闭 Fastjson 循环引用
        JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect.getMask();
    }
}

注册到 bean 容器后就会生效

2、局部配置关闭

System.out.println("处理后---" + JSON.toJSONString(list, SerializerFeature.DisableCircularReferenceDetect));

其实 bug2 是由 bug1 引起的,这是因为创建 HashMap 是在循环的外面,改成到里面就没有问题了。


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;


public class RefFastJson {

    public static void main(String[] args) {
        // 模拟返回的数据
        String str = "{\n" +
                "    \"code\": 200,\n" +
                "    \"data\": {\n" +
                "        \"users\": [\n" +
                "            {\n" +
                "                \"name\": \"死灵\",\n" +
                "                \"sex\": \"男\",\n" +
                "                \"age\": 18\n" +
                "            },\n" +
                "            {\n" +
                "                \"name\": \"骷髅\",\n" +
                "                \"sex\": \"男\",\n" +
                "                \"age\": 20\n" +
                "            },\n" +
                "            {\n" +
                "                \"name\": \"小黑\",\n" +
                "                \"sex\": \"女\",\n" +
                "                \"age\": 38\n" +
                "            }\n" +
                "        ]\n" +
                "    },\n" +
                "    \"msg\": \"操作成功\"\n" +
                "}";

        // 开始使用 JSONObject 处理数据
        JSONObject jsonObject = JSONObject.parseObject(str);
        JSONObject data = jsonObject.getJSONObject("data");

        String users = data.getString("users");
        List<TUser> userList = JSONObject.parseArray(users, TUser.class);
        ArrayList<HashMap<String, Object>> list = new ArrayList<>();

        // TODO 此为情况1,即 HashMap 创建在循环外面
//        HashMap<String, Object> hashMap = new HashMap<>();

        userList.forEach((user) -> {
            // TODO 此为情况2,即 HashMap 创建在循环里面
            HashMap<String, Object> hashMap = new HashMap<>();
            hashMap.put("name", user.getName());
            hashMap.put("sex", user.getSex());
            hashMap.put("age", user.getAge());
            list.add(hashMap);
        });

        System.out.println("list---" + list);
        System.out.println("处理前---" + JSON.toJSONString(list));
        System.out.println("处理后---" + JSON.toJSONString(list, SerializerFeature.DisableCircularReferenceDetect));

    }
}


class TUser {
    private String name;
    private String sex;
    private int age;

    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

输出结果

list---[{sex=男, name=死灵, age=18}, {sex=男, name=骷髅, age=20}, {sex=女, name=小黑, age=38}]
处理前---[{"sex":"男","name":"死灵","age":18},{"sex":"男","name":"骷髅","age":20},{"sex":"女","name":"小黑","age":38}]
处理后---[{"sex":"男","name":"死灵","age":18},{"sex":"男","name":"骷髅","age":20},{"sex":"女","name":"小黑","age":38}]

可以看到,bug1 改好后 bug2 就不出现了。

所以出现这个 {"$ref":"$[0]"} 建议检查是否在处理循环时,创建对象的时机不对

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-04-09 18:32:44  更:2022-04-09 18:35:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 20:58:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码