首页新闻找找看学习计划

fastjson为map生成json字符串的问题

0
悬赏园豆:5 [待解决问题]

map的键、值都是自定义类型,请问有没有什么json库可以处理这样的map啊

darknessplus的主页 darknessplus | 初学一级 | 园豆:141
提问于:2019-03-27 15:29
< >
分享
所有回答(1)
0

fastjson、gson、jackson这几种json库都支持呀,比如定义一个Map<Person,Teacher>,put数据后直接使用json库转换即可,不过这种方式好像很少见。

    List subjects = new ArrayList<>();
    subjects.add("math");
    subjects.add("chinese");
    subjects.add("english");

    Map score = new HashMap<>();
    score.put("math", 99);
    score.put("chinese", 100);
    score.put("english", 59);

    // 创建一个对象
    Person person = new Person();
    person.setName("张三");
    person.setAge(99);
    person.setWage(99999.98);
    person.setGender(true);
    person.setSubjects(subjects);
    person.setScore(score);
    
    Person person2 = new Person();
    person2.setName("李四");
    person2.setAge(99);
    person2.setWage(99999.98);
    person2.setGender(true);
    person2.setSubjects(subjects);
    person2.setScore(score);
    
    Map m = new HashMap<>();
    m.put(person, "11111111");
    m.put(person2, "2222222");

    String jsonStr = JSON.toJSONString(m, true);
    System.out.println(jsonStr);
    
    /**
    {
        {
            "age":99,
            "gender":true,
            "name":"张三",
            "score":{
                "chinese":100,
                "english":59,
                "math":99
            },
            "subjects":[
                "math",
                "chinese",
                "english"
            ],
            "wage":99999.98
        }:"11111111",
        {
            "age":99,
            "gender":true,
            "name":"李四",
            "score":{"$ref":"$.null.score"},
            "subjects":[
                "math",
                "chinese",
                "english"
            ],
            "wage":99999.98
        }:"2222222"
    }
     */
寻觅beyond | 园豆:433 (菜鸟二级) | 2019-03-30 11:11

不对吧,json根本解析不出来啊

支持(0) 反对(0) darknessplus | 园豆:141 (初学一级) | 2019-03-30 22:27

@darknessplus:
解析就算了,你自己慢慢搞吧,你倒是可以了解一下json的解析策略。
不过我有点纳闷,你在哪儿见过json中的key是基本数据类型以外的值??自定义数据类型就是class type了呗,这不是把问题复杂化吗?

支持(0) 反对(0) 寻觅beyond | 园豆:433 (菜鸟二级) | 2019-04-01 21:20

@寻觅beyond: 其实问题就在解析啊,有没有能把map一键转化成js能解析的json字符串的工具,你上面生成的json字符串前端根本无法解析,起码要变成这样:

{
    "data": [
        {
            "age": 99,
            "gender": true,
            "name": "张三",
            "score": [
                {
                    "subject": "chinese",
                    "score": 100
                },
                {
                    "subject": "english",
                    "score": 59
                },
                {
                    "subject": "math",
                    "score": 59
                }
            ],
            "wage": 99999.98,
            "teacher": "11111"
        },
        {
            "age": 99,
            "gender": true,
            "name": "李四",
            "score": [
                {
                    "subject": "chinese",
                    "score": 100
                },
                {
                    "subject": "english",
                    "score": 59
                },
                {
                    "subject": "math",
                    "score": 59
                }
            ],
            "wage": 99999.98,
            "teacher": "22222"
        }
    ]
}
支持(0) 反对(0) darknessplus | 园豆:141 (初学一级) | 2019-04-01 21:41

@darknessplus:
前端解析json的时候,key的类型是string类型,不能为对象类型;
所以后端返回给前端的json数据中,key都应该是String类型,所以后端在生成json串的时候,就不应该将object类型的值作为key值,否则前端是无法解析的。

你倒是可以写一个工具类:你可以创建一个map中key为object类型的json,然而你并不将该json返回给前端,而是使用自定义的工具类,将前面创建json的原始数据,重新生成一个key为String类型的json串,然后再返回给前端,前端就是可以解析的了

支持(0) 反对(0) 寻觅beyond | 园豆:433 (菜鸟二级) | 2019-04-02 10:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册