package json;
public class User {
public String name;
}
package json;
import jodd.io.FileUtil;
import com.alibaba.fastjson.JSON;
import com.google.gson.Gson;
public class JsonTest {
public static void main(String[] args) {
// String json = "{\"name\":\"abcde\"}";
String json = "{\"name\":\"ab\\cde\"}";
System.out.println(json);
//t1(json);
t2();
}
public static void t2() {
User user = new User();
user.name = "ab\\cde";
System.out.println(user.name);
String json = JSON.toJSONString(user);
System.out.println(json);
json = new Gson().toJson(user);
System.out.println(json);
}
public static void t1(String json) {
User user2 = JSON.parseObject(json, User.class);
User user3 = new Gson().fromJson(json, User.class);
}
}
t2 方法结果:
ab\cde
{"name":"ab\\cde"}
{"name":"ab\\cde"}
可以看出,gson,fastjson自动转义了,将一个\符号,换成了两个\\符号。
t1方法结果:
{"name":"ab\cde"}
Exception in thread "main" com.alibaba.fastjson.JSONException: unclosed string : c
at com.alibaba.fastjson.parser.JSONLexerBase.scanString(JSONLexerBase.java:970)
at com.alibaba.fastjson.parser.JSONLexerBase.nextToken(JSONLexerBase.java:104)
at com.alibaba.fastjson.parser.JSONLexerBase.nextTokenWithChar(JSONLexerBase.java:360)
at com.alibaba.fastjson.parser.JSONLexerBase.nextTokenWithColon(JSONLexerBase.java:478)
at com.alibaba.fastjson.parser.deserializer.ASMJavaBeanDeserializer.parseField(ASMJavaBeanDeserializer.java:73)
at com.alibaba.fastjson.parser.deserializer.ASMJavaBeanDeserializer$InnerJavaBeanDeserializer.parseField(ASMJavaBeanDeserializer.java:86)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:310)
at com.alibaba.fastjson.parser.deserializer.ASMJavaBeanDeserializer.parseRest(ASMJavaBeanDeserializer.java:96)
at Fastjson_ASM_User_1.deserialze(Unknown Source)
at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:513)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:244)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:220)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:179)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:323)
at json.JsonTest.t1(JsonTest.java:33)
at json.JsonTest.main(JsonTest.java:15)
由于{"name":"ab\cde"} 有转义字符,所以报异常了。
如果换成String json = "{\"name\":\"ab\\\\86cde\"}";就没问题了。有两个\\符号。
java 定义一个\ 字符串表示是 “\\”, 定义两个 \\ 字符串表示 “\\\\”
控制台输出是 \ ,\\
文件里面的\字符串,控制台输出就是\
String s = "\\";
String ss = "\\\\";
System.out.println(s);
System.out.println(ss);
//文件的内容:\
String sss = FileUtil.readString("f:\\5.txt", "gbk");
System.out.println(sss);
输出结果:
\
\\
\
public static void test2() throws Exception {
User user = new User();
// 内容带有 \符号
String s = FileUtil.readString("f:\\2.txt");
user.name = s;
// json。toJSONString 转换后 \ 变成 \\
String json = JSON.toJSONString(user);
System.out.println(json);
// json 转换后 \\ 变成 \ 所以 user.name.equals(user2.name) true
User user2 = JSON.parseObject(json, User.class);
// json 转换后 \\ 变成 \
System.out.println(user2.name);
System.out.println("===============================");
// 所以 user.name.equals(user2.name) true
System.out.println(user.name.equals(user2.name));
// System.out.println("user.name len =="+s.length());
// System.out.println("user2.name len =="+user2.name.length());
}
总结:
1. java 对象 转换为 json 字符串,会对一些字符转义。
2. 转义后的 json字符串 转换为java对象,会将转义后的字符串反转义,还原。
注意:未转义的json字符串(如果含有特殊字符),转换会报错。