javascript - 为什么Swift无法识别JS发送的数组?

标签 javascript ios swift networking

我正在使用 Webviewjs 进行通信。我再次将收到的数据传输到参数 api 中。但是,当 SwiftJS 获取数组时,Swift 无法正确识别它。

JS 数据发送到哪里

var jsonData = {
  data,
  type : "fromjs"
};
alert(jsonData)
webkit.messageHandlers.sendFromJS.postMessage(jsonData);

警报查看的数据

{
    "type" = "fromjs",
    "data" = {
            "num": "one",
            "arr_data" : [{ "title": "test1", "val" : "testval1" },
                          { "title": "test2" , "val" : "testval2"}]
           }
}

我检查 Swift 收到的数据。

@available(iOS 8.0, *)
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
   if message.name == "sendFromJS" {
        let getdata = message.body as! NSDictionary
        print(getdata)

但是 Swift 无法正确识别该数组。

{
    type = "fromjs",
    data = {
            "num": "one",
            "arr_data" : ({ "title": "test1", "val" : "testval1" },
                          { "title": "test2" , "val" : "testval2"})
           }
}

Swift 将方括号识别为圆括号。

如何解决这个问题?我必须将收到的数据按原样放入参数中来发送。

func apiCall(_ param: NSDictionary){
   let parameters: [String: AnyObject] = param["data"] as! [String : AnyObject]
Alamofire.request(url, method: .post, parameters: parameters, encoding: URLEncoding.default, headers: headers)

我更改了数据类型。但同样无法识别。

let getdata = message.body as! [String : Any]
 print(getdata)

//log
[
    type = "fromjs",
    data = {
            "num": "one",
            "arr_data" : ({ "title": "test1", "val" : "testval1" },
                          { "title": "test2" , "val" : "testval2"})
           }
]

在js中创建json数据

var data = {
  num: "one"
};
var data_arr = [];
data_arr.push({"title": "test1", "val" : "testval1"});
data_arr.push({"title": "test2" , "val" : "testval2"});
data.arr_data = data_arr;
var jsonData = {
  data,
  type : "fromjs"
};
alert(jsonData)
webkit.messageHandlers.sendFromJS.postMessage(jsonData);

最佳答案

这只是 JSON 和传统 NeXT 属性列表表示数组的方式不同。

示例

let json = """{ "a": [1, 2, 3] }"""
let jsonData = try! JSONSerialization.jsonObject(with: Data(json.utf8), options: [])
print("plist:", jsonData)
let jsonString = try! JSONSerialization.data(withJSONObject: d, options: [.prettyPrinted])
print("json:", String(data: jsonString, encoding: .utf8)!)  

打印日志

plist: {
    a =     (
        1,
        2,
        3
    );
}
json: {
  "a" : [
    1,
    2,
    3
  ]
}  

属性列表使用 ( … ) 呈现数组,但这只是一种呈现方式。实际对象是正确的,事实证明我可以将它们转回我开始使用的一些 JSON。

关于javascript - 为什么Swift无法识别JS发送的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58868886/

相关文章:

javascript - 连续的 promise

ios - 如何从 NSDictionary 分配图像和标签值?

iphone - 在将应用程序提交到 App Store 之前忘记删除断点

swift - Sum 和 For 在 Swift 中一起循环

ios - 在 Array 扩展中的泛型函数中使用 append

javascript - 建立固定的粘性侧边栏的问题

javascript - 当在单个页面上使用此 .js 两次时,它仅在一个实例中有效

ios - 如何将 UITableView 设置为捕捉到最近的单元格?

ios - 替换文本以更改音高/调

javascript - 将日期显示为日期时间输入