您的位置:首页 > Web前端 > JavaScript

json 转义字符

2016-03-10 16:05 148 查看
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字符串(如果含有特殊字符),转换会报错。 

   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: