本文主要总结了fastjson常用的几种转换方式,主要为Map与JSON、Class与JSON和List< Class>与JSON的相互转换。
解决fastjson循环引用问题和重复引用
JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect.getMask();
public static void main(String[] args) {
// JSON.DEFAULT_GENERATE_FEATURE |=
// SerializerFeature.DisableCircularReferenceDetect.getMask();
List<String> innerList = new ArrayList<>();
innerList.add("121102,大额支取,1,other,001,0,0,0,0,03,,,0,0,trade/dezq.html");
List<Object> outterList = new ArrayList<>();
outterList.add(innerList);
Map<String, Object> map = new HashMap<>();
map.put("trade/dezq.html", outterList);
map.put("121102", outterList);
// String value = JSON.toJSONString(map, SerializerFeature.DisableCircularReferenceDetect);// 关闭循环引用
String value = JSON.toJSONString(map);
System.err.println(value);
}
结果:
{“trade/dezq.html”:[[“121102,大额支取,1,other,001,0,0,0,0,03,0,0,trade/dezq.html”]],“121102”:[{" r e f " : " ref":" ref":".trade\/dezq\.html[0]"}]}
关闭循环引用后结果为:
{“trade/dezq.html”:[[“121102,大额支取,1,other,001,0,0,0,0,03,0,0,trade/dezq.html”]],“121102”:[[“121102,大额支取,1,other,001,0,0,0,0,03,0,0,trade/dezq.html”]]}
JSON2Map
JSON与Map、JSON与List、JSON与String[]等之间的转换大体相同,本文以JSON2Map为例,代码如下:
public static void json2Map()
{
// Map -> JSON
Map<String, String> map = new HashMap<String, String>();
map.put("a", "A");
map.put("b", "B");
map.put("c", "C");
String json = JSON.toJSONString(map, true);
System.out.println(json);
// JSON -> Map
Map<String, String> map1 = (Map<String, String>) JSON.parse(json);
System.out.println(map1);
for (String key : map1.keySet())
{
System.out.println(key + ":" + map1.get(key));
}
}
运行结果如下:
{
“a”:“A”,
“b”:“B”,
“c”:“C”
}
{“a”:“A”,“b”:“B”,“c”:“C”}
b:B
c:C
a:A
其中,JSON.toJSONString(map,true)中的true为可选参数,第二个参数的含义为文本是否带格式化,当为JSON.toJSONString(map)时,输出结果为:
{“a”:“A”,“b”:“B”,“c”:“C”}
{“a”:“A”,“b”:“B”,“c”:“C”}
b:B
c:C
a:A
可以看到,是否带格式化的输出结果是有些许差异。
JSON2Class
代码如下:
public static void json2Object()
{
// Class -> JSON
Person person = new Person("Jack", "man", 20);
String json = JSON.toJSONString(person);
System.out.println(json);
// JSON -> Class
Person p = JSON.parseObject(json, Person.class);
System.out.println(p);
}
其中的Person.java为:
public class Person
{
String name;
String sex;
int age;
// 这个构造函数必须存在,否则会报异常,com.alibaba.fastjson.JSONException: default constructor not found.
public Person()
{
}
public Person(String name)
{
this.name = name;
}
public Person(String name,String sex, int age)
{
this.name = name;
this.sex = sex;
this.age = 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;
}
@Override
public String toString()
{
return "Person [name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
}
输出结果为:
{“age”:20,“name”:“Jack”,“sex”:“man”}
Person [name=Jack, sex=man, age=20]
在json转Class中需要注意:
Person中的默认空参的构造函数不能省略,即public Person(){ }必须有,否则会报异常:
com.alibaba.fastjson.JSONException: default constructor not found.
JSON2List
代码如下:
public static void json2List()
{
// List<Class> -> JSON
Person person = new Person("Jack", "man", 20);
Person person2 = new Person("Marry", "woman", 18);
List<Person> list = new ArrayList<Person>();
list.add(person);
list.add(person2);
String json = JSON.toJSONString(list);
System.out.println(json);
// JSON -> List<Class>
List<Person> re = JSON.parseArray(json, Person.class);
System.out.println(re);
for (int i = 0; i < re.size(); i++)
{
Person p = re.get(i);
System.out.println(p.getName() + " is a " + p.getAge() + " years old " + p.getSex());
}
}
运行结果如下:
[{“age”:20,“name”:“Jack”,“sex”:“man”},{“age”:18,“name”:“Marry”,“sex”:“woman”}]
[Person [name=Jack, sex=man, age=20], Person [name=Marry, sex=woman, age=18]]
Jack is a 20 years old man
Marry is a 18 years old woman