【问题标题】:Json string mutatingJson字符串变异
【发布时间】:2011-12-04 02:00:10
【问题描述】:

我有一个 .Net WCF Rest 服务返回 Json 以供 Android 应用使用。

在调试中,WCF 服务正确的返回值(Json)为:

{"BaseLoyaltyPoints":1480,"BonusLoyaltyPoints":0,"BrandId":1414, [etc...] }

同样在debug中,当它返回记事本时,返回值变成了:

{\"BaseLoyaltyPoints\":1480,\"BonusLoyaltyPoints\":0,\"BrandId\":1414, [etc...] }

当它进入我的 Android 应用时,它变成了:

{\\"BaseLoyaltyPoints\\":1480,\\"BonusLoyaltyPoints\\":0,\\"BrandId\\":1414, [etc...] }

这是我用来序列化 Json 的样板代码:

Dim stream1 As MemoryStream = New MemoryStream
Dim ser As DataContractJsonSerializer = New DataContractJsonSerializer(GetType(FullProduct))
ser.WriteObject(stream1, Me)

Dim _json As String = Encoding.UTF8.GetString(stream1.ToArray())
stream1.Close()

获取Json的Android代码是:

HttpClient httpclient = new DefaultHttpClient();
HttpGet request = new HttpGet(getString(R.string.CONST_RestService) + "/json/Product/" + productID);
ResponseHandler<String> handler = new BasicResponseHandler();       
result = httpclient.execute(request, handler);  
jObject = new JSONObject(result);

发生了什么事?

谢谢

戴夫

【问题讨论】:

    标签: android vb.net wcf rest


    【解决方案1】:

    JSON 数据需要是一个可评估的 JavaScript 字符串 - “字符需要转义为 \”(字符“而不是字符串限制器”),并且该表达式中的 \ 也需要转义(因为 \ 也是一个特殊字符)。所以一直都是那个字符串,只是每次打印的都不一样。

    以这个 JavaScript 为例:

    object = JSON.parse("{\"hello\":\"World\"}");
    alert(object.hello);
    

    以下更多的是猜测而不是实际知识,因为我不知道您使用的类的具体行为如何,但我认为它是正确的。

    如您所见," 字符需要转义为 \",因此您的 .NET JSON 序列化程序就是这样做的。一切都很好,将其解释为 JS 会按预期工作。

    现在 可能 正在发生的事情是您的 JSONObject 构造函数不希望字符串已经正确转义,所以它自己会这样做。澄清一下:当您说“使用一个转义字符”时,您的意思可能是这样的:

    String workingJSONString = "{\"Hello\":\"World\"}"
    

    对吗?这里的问题是 Java 具有与 JavaScript 相同的转义规则——这不是你从 HTTPRequest 中得到的,你得到的是

    String youGotThis = "{\\\"Hello\\\":\\\"World\\\"}"
    

    因为您的字符串中有文字反斜杠,并且这些反斜杠也需要转义。我很确定这是怎么回事,你可能要么必须告诉你的 .NET JSON 序列化程序不要应用转义规则,要么找到从正确转义的 JSON 字符串构造 JSONObject 的东西 - 或者删除不必要的转义自己。

    我希望这会有所帮助 - 但我也不能完全确定,所以你应该看看它是否真的像我说的那样运行。

    【讨论】:

    • 如果我为 Android 提供了一个静态的 Json 字符串,其中只有一个转义字符,它会处理它。带有 2 个转义字符的字符串会导致它失败。我的问题是,这 2 个转义字符是从哪里来的,如果必须这样,我需要对 Android 代码进行哪些更改才能处理它?
    • ... 或者更确切地说,为什么 Android 在 jObject = new JSONObject(result); 处抛出 Json 异常; ?
    • 感谢立方。我明白你在说什么,而且似乎确实如此。我将 .net 默认序列化程序更改为 Newtonsoft 并得到了相同的结果。我正在寻找一些东西来取代 Android 内置的 json 解析器。很惊讶没有其他人和我有同样的问题。无论如何,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多