json 转义字符

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

   

猜你喜欢

转载自m635674608.iteye.com/blog/2237694