我有一个由 .net Web 服务支持的多平台 Cordova 应用程序,该应用程序返回 JSON 数据以进行同步。这工作得很好。
我现在正在尝试将 native 调用添加到连接到 BroadcastReceiver 的应用程序的 Android 版本中,以便我可以在应用程序未运行时提供丰富的通知。
这些事件的调度和执行运行良好;但我在处理 Web 服务调用的结果时遇到了真正的问题。
Web 服务调用 (VB.net) 是:
<OperationContract()>
<WebInvoke(Method:="POST", ResponseFormat:=WebMessageFormat.Json)>
Public Function SyncNotifications_Native(ByVal dateAfter As String, ByVal which As Integer, ByVal userID As Int32) As String
Dim rowsList As New List(Of Dictionary(Of String, Object))()
Dim row As Dictionary(Of String, Object)
:::
:::
While dr.Read()
row = New Dictionary(Of String, Object)
row.Add("allow_reply", dr("allow_reply"))
row.Add("content", dr("content"))
row.Add("date_added", dr("date_added")
row.Add("date_deleted", dr("date_deleted")
row.Add("date_read", dr("date_read")
row.Add("deleted", dr("deleted"))
row.Add("last_update", Now().ToString("yyyy-MM-dd HH:mm:ss"))
row.Add("notification_id", dr("notification_id"))
row.Add("subject_line", dr("subject_line"))
row.Add("user_id", dr("user_id"))
rowsList.Add(row)
End While
Return New JavaScriptSerializer().Serialize(details)
End Function
这应该返回一个包含零个或多个条目的数组。 我正在使用 AsyncTask 来获取数据。这是我从调用中返回的数据:
{"d":"
[{\"allow_reply\":1,\"content\":\"test content\",
\"date_added\":\"2016-02-04 23:37:50\",\"date_deleted\":\"\",
\"date_read\":\"\",\"deleted\":0,\"last_update\":\"2016-02-04 23:38:43\",
\"notification_id\":27,\"subject_line\":\"test\",\"user_id\":1}]
"}
我查看了各种资源并尝试了所有类型的解决方案。这就是我目前正在做的事情:
将返回字符串转换为 JSON 对象:
JSONObject json2 = new JSONObject(s);
尝试从对象中取出数组:
JSONArray results = json2.getJSONArray("d");
这种方式给了我一个错误:
java.lang.String cannot be converted to JSONArray
我在另一篇文章中看到了一个建议,即我实际上是从我的 Web 服务返回 SOAP 响应;我不确定,我还没有看到任何其他以
开头的 JSON 响应示例{"d":
如何正确地将返回的数组放入 JSONArray 中,以便将其传递给另一个函数?
谢谢
最佳答案
我不是 Java 开发人员,所以:
{"d": "[{\"allow_reply\":1,\....."}
是一个对象- 带有
d
字段 - 其值为
字符串
"[{\"allow_reply\":1,\....."}
这就是为什么你得到java .lang.String 无法转换为 JSONArray
- 所以你必须
解析
(又名“反序列化”)
所以在 Javascript
中(你必须 translate to Java ):
//this is the data your service returns
var foo = {"d": "[{\"allow_reply\":1,\"content\":\"test content\",\"date_added\":\"2016-02-04 23:37:50\",\"date_deleted\":\"\",\"date_read\":\"\", \"deleted\":0,\"last_update\":\"2016-02-04 23:38:43\",\"notification_id\":27,\"subject_line\":\"test\",\"user_id\":1}]"};
//parse the string
var data = JSON.parse(foo.d);
data
现在包含您的数组
因此,在上面的代码中,您必须解析
字符串并将其转换为它表示的对象(来自字符串
)。
第...
关于java - 无法从 .net Web 服务获取 JSONArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35214373/