2017-07-18 53 views
1

与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端就足够了。

+0

我认为这是因为你引述的价值,但也没有逃脱“\”。 'JSON.parse( '[{ “值”:[ “\\” FOO \\ “”]}]');'WFM – 2017-07-18 15:22:36

+0

'JSON.parse('[{ “值”:[ “\\\” 富\\\“”]}]');''''''''''''''''''''''''''''另一种选择是潜在地编码双引号但是是。 –

回答

2

您需要使用JavaScript的JSON.parse双反斜线。这应该工作:

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

这是因为你还需要转义反斜线。

+0

在这个有限的例子中手动改变字符串文字,但我需要一个函数或JavaScript中的正则表达式来在需要时执行替换。我尝试过'.replace(/ \\/g,“\\\\”);'和其他各种形式,但似乎没有产生JSON可以在JavaScript中解析的字符串。 –

+0

https://stackoverflow.com/questions/16144090/replace-single-backslash-with-double-backslashes – Chris

+0

我很明显看到,它不工作。这个问题在于赋予Javascript的字符串(''{“values”:[“\”foo \“”]}'')实际上并不包含任何要替换的反斜杠。出现的反斜杠是转义字符。更换字符串中的所有双引号会更有意义,但这也会更改导致失败的字符串形式的属性名称。 –