jsonエスケープ文字

4601 ワード

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);

	}
}

 
 
t 2メソッドの結果:
   
ab\cde
{"name":"ab\\cde"}
{"name":"ab\\cde"}

 
 
gson,fastjsonが自動的にエスケープし,1つの記号を2つの記号に変換したことがわかる.
 
t 1メソッドの結果:
  
{"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":"abcde"}にエスケープ文字があるため、異常を報告しました.
 
String json="{"name":ab\\86 cde"};大丈夫です.\記号が2つあります.
 
JAvaは、1つの文字列が「\」であることを定義し、2つの\文字列が「\」であることを定義します.
コンソール出力は,\
 
ファイル内の文字列、コンソール出力は
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文字列(特殊文字が含まれている場合)は、変換が間違っています.