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字符串(如果含有特殊字符),转换会报错。