Json字符串变异

时间:2011-12-04 02:00:11

标签: android vb.net wcf rest

我有一个.Net WCF Rest服务,让Json被Android应用程序使用。

在调试中,WCF服务正确地将返回值(Json)设置为:

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

同样在调试中,当它返回到记事本时,返回值已更改为:

{\"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);

发生了什么事?

由于

戴夫

1 个答案:

答案 0 :(得分:0)

JSON数据需要是一个可评估的JavaScript字符串 - “字符需要转义为\”(字符“与字符串限制器相对”),并且该表达式中的\也需要进行转义(因为\也是一个特殊的角色)。所以它一直是那个字符串,每次都是以不同的方式打印。

以此JavaScript为例:

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

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

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

现在可能正在进行的是你的JSONObject构造函数不希望Strings已经被正确转义,所以它自己就是这样做的。澄清:当你说“有一个逃脱角色”时,你可能意味着这样的事情:

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

正确?这里的问题是Java具有与JavaScript相同的转义规则 - 这不是你从HTTPRequest获得的,你得到的是

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

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

我希望这会有所帮助 - 但是,我并不完全确定,所以你应该检查它是否真的像我说的一样。