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"
}
*/
不对吧,json根本解析不出来啊
@darknessplus:
解析就算了,你自己慢慢搞吧,你倒是可以了解一下json的解析策略。
不过我有点纳闷,你在哪儿见过json中的key是基本数据类型以外的值??自定义数据类型就是class type了呗,这不是把问题复杂化吗?
@寻觅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"
}
]
}
@darknessplus:
前端解析json的时候,key的类型是string类型,不能为对象类型;
所以后端返回给前端的json数据中,key都应该是String类型,所以后端在生成json串的时候,就不应该将object类型的值作为key值,否则前端是无法解析的。
你倒是可以写一个工具类:你可以创建一个map中key为object类型的json,然而你并不将该json返回给前端,而是使用自定义的工具类,将前面创建json的原始数据,重新生成一个key为String类型的json串,然后再返回给前端,前端就是可以解析的了