我有一个。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);
怎么回事?
感谢戴夫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的东西,或者自己删除不必要的转义。
我希望这对你有帮助-但是,我也不完全确定,所以你应该检查一下它是否真的像我说的那样运行。