JavaScript无法解析从Java

时间:2017-07-18 15:19:15

标签: javascript java json gson

这不是this question的重复,因为这里的问题具体是关于在JavaScript中以字面形式从Java序列化的JSON字符串的表示(并且它不仅仅需要担心双引号)。

我使用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);
    }
}

...上面的代码显示序列化和反序列化是可行的并且有效。我还为LOV类编写了一个equals方法,以确定重新内化的对象(lov2)等于最初序列化的对象(事实上,我只是跳过这段代码来保持这个短)。

以上代码在控制台上打印:

Stringified JSON is: [{"values":["\"foo\""]}]

JavaScript内化

然而,当我试图在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')就足够了。

1 个答案:

答案 0 :(得分:2)

您需要为Javascript&#39; JSON.parse使用双反斜杠。这应该有效:

JSON.parse('{"values":["\\"foo\\""]}');

这是因为你还需要逃避反斜杠。