我有一个.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);
发生了什么事?
由于
戴夫
答案 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的东西 - 或者删除不必要的转义自己。
我希望这会有所帮助 - 但是,我并不完全确定,所以你应该检查它是否真的像我说的一样。