与GSON序列串这不是this question重复这里的问题是,特别是约在JavaScript中的文字形式从Java序列化JSON字符串表示(和它比双引号一个需要担心更多关于)。的JavaScript无法解析从Java
我使用Gson在Java中创建了一个序列化的JSON对象,随后我无法使用JSON.parse从Javascript内部化。当我在Java对象中使用双引号时,会发生这种情况。我觉得莫名其妙的GSON应该照顾正确转义和JSON序列化格式是与语言无关的,所以当我从Java序列化,我应该能够从JavaScript反序列化,没有任何麻烦。
最小以下代码:
Java序列
import java.util.*;
import java.lang.reflect.Type;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
class LOV {
List<String> values;
public LOV(List<String> values) {
this.values = values;
}
}
public class FooMain {
private static final Gson gson = new GsonBuilder().serializeNulls().create();
@SuppressWarnings("unchecked")
public static <T> T fromJson(String json, Class<T> classOfT) {
T target = (T) gson.fromJson(json, (Type) classOfT);
return target;
}
public static void main(String args[]) {
List<String> values = new ArrayList<>();
values.add("\"foo\"");
LOV lov = new LOV(values);
String s = gson.toJson(lov);
System.out.printf("Stringified JSON is: [%s]\n", s);
LOV lov2 = fromJson(s, LOV.class);
}
}
&hellip;上面的代码显示序列化和反序列化是可能的并且可行。我还写了一个equals
方法为LOV类以建立重内在对象(lov2
)等于原序列化的一个(这是,我只是跳过此代码保持这种短)。
控制台上面的代码打印:
Stringified JSON is: [{"values":["\"foo\""]}]
的JavaScript内
然而,当我试图在JavaScript内化在Java创建的字符串:
JSON.parse('{"values":["\"foo\""]}');
&hellip;我得到:
Uncaught SyntaxError: Unexpected token f in JSON at position 13(…)
分辨率
最后,根据公认的答案和评论它我自动转义字符数在Java的一面,但有许多情况要考虑。所以我不得不这样做(在Java中)以下全部:
s.replace("\\", "\\\\")
s.replace("\"", "\\\"")
s.replace("'", "\\'")
&hellip;并在JavaScript端我也不得不这样做:
JSON.parse('the string literal prepared by Java'.replace(/\t/g, "\\t"));
这是工作,但也越来越复杂,我不知道我把所有覆盖的情况下,所以最终我只是用StringEscapeUtils.escapeEcmaScript和它的工作就像一个魅力。使用escapeEcmaScript
简单的JSON.parse('the string literal prepared by Java')
在JavaScript端就足够了。
我认为这是因为你引述的价值,但也没有逃脱“\”。 'JSON.parse( '[{ “值”:[ “\\” FOO \\ “”]}]');'WFM – 2017-07-18 15:22:36
'JSON.parse('[{ “值”:[ “\\\” 富\\\“”]}]');''''''''''''''''''''''''''''另一种选择是潜在地编码双引号但是是。 –