这不是this question的重复,因为这里的问题具体是关于在JavaScript中以字面形式从Java序列化的JSON字符串的表示(并且它不仅仅需要担心双引号)。
我使用Gson在Java中创建一个序列化的JSON对象,我后来无法使用JSON.parse从Javascript内化。当我在Java对象中转义双引号时会发生这种情况。我发现令人困惑的是Gson应该处理正确的转义,而JSON序列化格式与语言无关,因此当我从Java序列化时,我应该能够从JavaScript反序列化而不会有任何麻烦。
下面的最小代码:
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);
}
}
...上面的代码显示序列化和反序列化是可行的并且有效。我还为LOV类编写了一个equals
方法,以确定重新内化的对象(lov2
)等于最初序列化的对象(事实上,我只是跳过这段代码来保持这个短)。
以上代码在控制台上打印:
Stringified JSON is: [{"values":["\"foo\""]}]
然而,当我试图在JavaScript中内化由Java创建的字符串时:
JSON.parse('{"values":["\"foo\""]}');
......我明白了:
Uncaught SyntaxError: Unexpected token f in JSON at position 13(…)
最后,根据已接受的答案及其评论,我自动从Java端转移了许多字符,但有很多情况需要考虑。所以我必须做(使用Java)以下所有内容:
s.replace("\\", "\\\\")
s.replace("\"", "\\\"")
s.replace("'", "\\'")
...在JavaScript方面我也必须这样做:
JSON.parse('the string literal prepared by Java'.replace(/\t/g, "\\t"));
这是有效的,但是变得越来越复杂,我不确定我是否覆盖了所有案例,所以最后我使用了StringEscapeUtils.escapeEcmaScript,它就像一个魅力。使用escapeEcmaScript
一个简单的JSON.parse('the string literal prepared by Java')
就足够了。
答案 0 :(得分:2)
您需要为Javascript&#39; JSON.parse
使用双反斜杠。这应该有效:
JSON.parse('{"values":["\\"foo\\""]}');
这是因为你还需要逃避反斜杠。