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文字列(特殊文字が含まれている場合)は、変換が間違っています.