iOS OC与JS交互,传递JSON 遇到的问题

demo地址,还没有上传;

在往js传封装的json的时候,我这里用了四种处理方式,前三种都是在data后面包含了一个字符串,第四种包含的是一个对象。
传递的json数据格式:

{
"data" : "{包含的数据}"
}

这三种方法不同的地方在于这个 ”包含的数据“ 的不同

在js的代码中,在接受oc传过来的数据之后,调用的方法是

//将 result(从OC传到JS中的json字符串)转为json对象
  var msg = JSON.parse(result);
  console.info("JSON:" + msg);

那么问题来了......

在这四种方法中,我在OC封装的JSON数据都是可以在线解析的,数据格式正确。

区别是:前三种方法中 data 对应的 value 是字符串,第四种是对象。到了JS这边就只有第四种接收正确了,可以被正确解析,前三种的JSON数据都报错,在JS代码中执行到var msg = JSON.parse(result);这个方法就卡死了。

oc封装:(获取的定位信息)
第一种情况:(直接将字典对象转为字符串,然后没有去掉 空格 和 换行 字符)
先将这个数据(字典对象)转为字符串:

{\ncity=\"\\U5e7f\\U5dde\\U5e02\";\ncitycode=020;\nlatitude=nil;\nlongitude=nil;\nresult=fail;\n}

封装之后的数据:

{
    "data": "{\ncity=\"\\U5e7f\\U5dde\\U5e02\";\ncitycode=020;\nlatitude=nil;\nlongitude=nil;\nresult=fail;\n}",
    "callbackid": "9cf324f8-7606-ab8a-74e6-8902c75ec816"
}

然后传给js
js接受的数据格式:(在线解析不了)

{"data":"{
city="\U5e7f\U5dde\U5e02";
citycode=020;
latitude=nil;
longitude=nil;
result=fail;
}","callbackid":"43887cdf-2b10-e5e9-1f59-921fbbf60723"}

第二种情况:(在第一种的情况下多加了一个步骤:去除空格和换行)
封装之后的数据:

{
    "data": "{\"citycode\":\"020\",\"result\":\"fail\",\"latitude\":\"nil\",\"longitude\":\"nil\",\"city\":\"广州市\"}",
    "callbackid": "0679b5ae-2e79-2dde-01db-1db3df484542"
}

js接收之后的数据格式:(在线解析不了)

{
    "data": "{"citycode":"020","result":"fail","latitude":"nil","longitude":"nil","city":"广州市"}",
    "callbackid": "1f96fbab-239f-811e-e8f7-4ce877e71bea"
}

第三种情况:(增加了将 双引号 “ 替换成 单引号 ‘ 的方法)(安卓传JS时的数据格式就是这种)
封装之后的数据:

{
    "data": "{'citycode':'020','result':'fail','latitude':'nil','longitude':'nil','city':'广州市'}",
    "callbackid": "13e85ae2-d3b7-81ac-a91b-17465b77f820"
}

但是这个数据格式当做参数传给JS的时候,OC调用JS的方法不成功,JS接受不到OC传递的数据。


第四种情况就是(增加一个方法,将

"citycode":"020","result":"fail","latitude":"nil","longitude":"nil","city":"广州市"
}

)这个数据当做一个对象来处理,即NSDictionary对象,而不是一个String。
然后封装完的数据是:

{
    "data": {
        "citycode": "020",
        "result": "fail",
        "latitude": "nil",
        "longitude": "nil",
        "city": "广州市"
    },
    "callbackid": "2e8f6b8f-1da5-5da5-ba45-1c215d095320"
}

传给js之后接受的数据格式:

{
    "data": {
        "citycode": "020",
        "result": "fail",
        "latitude": "nil",
        "longitude": "nil",
        "city": "广州市"
    },
    "callbackid": "2e8f6b8f-1da5-5da5-ba45-1c215d095320"
}

这四种情况,唯独最后一种是可行的。

安卓的传递之前的数据格式:

{
"callbackid":"4c745e8a-2d9b-5f17-756e-1b31054ff384",
"data":"{\u0027apnType\u0027:\u0027wifi\u0027,\u0027deviceManufacturer\u0027:\u0027Xiaomi\u0027,\u0027deviceModel\u0027:\u0027MI 4LTE\u0027,\u0027deviceOperatorName\u0027:\u0027中国联通\u0027,\u0027iMei\u0027:\u0027865931025442476\u0027,\u0027systemVersion\u0027:\u00274.4.4\u0027,\u0027restDiskSize\u0027:\u0027721 MB\u0027,\u0027isPad\u0027:false}"
}

安卓的JS接受之后的数据格式:

{
    "callbackid": "4c745e8a-2d9b-5f17-756e-1b31054ff384",
    "data": "{'apnType':'wifi','deviceManufacturer':'Xiaomi','deviceModel':'MI 4LTE','deviceOperatorName':'中国联通','iMei':'865931025442476','systemVersion':'4.4.4','restDiskSize':'721 MB','isPad':false}"
}

其实我在这里已经可以解决 往JS传递JSON数据的需求了,直接用第四种方法就可以了。
但是
项目
要求
安卓和iOS数据格式要
统一
安卓原生代码封装的JSON数据用的第三种方法中的数据格式,传给JS之后,没有任何变化,原原本本的被JS接受并且解析成功。这个iOS传过去之后就变了数据格式,不能解析了。

我很纳闷是什么原因,于是我怀疑是不是我用的调用JS的方法不对,于是我用了两种方法:

    NSString * handlerName = [self jsURlFormat:model.handlerName];
    NSString * data = [self jsURlFormat:model.data];
    NSString * callback = [self jsURlFormat:model.callback];
    NSString *jString = [NSString stringWithFormat:@"jsbridge.receive(%@,%@,%@)",handlerName,data,callback];
 JSContext *context = [[CsairWebView shareInstance] valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
        [context evaluateScript:jString];
    });
  [[CsairWebView shareInstance]  stringByEvaluatingJavaScriptFromString:self.jString];

我试过这两个方法之后,对与我传给JS的JSON数据,在jS端接受的数据没有任何变化,所以还是只有第四种方法行的通,其他三个没有变化。
然后
我有一个大胆的猜测

苹果在设计这个方法的时候不支持多层JSON数据的时候,最里层的为字符串,而是需要一个对象。

比如这个JSON数据结构中

{
"data" : "{包含的数据}"
}

这个 "{包含的数据}" 不能是字符串 ,必须是对象,也就是这个样子的

{
"data" : {包含的数据}
}

还有一个猜测就是这可能是一个BUG。

最后,我也没解决这个问题,探究不到原理,找了很多资料也找不到为什么。有哪位大神能告诉我一声,我下面是代码的地址,有兴趣的可以下载研究以下。我的QQ:812656410@qq.om

很希望有大神能帮我指导一下,感激不尽。

hahah;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,973评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,080评论 4 62
  • 不知不觉在酒店上班就一个月了,感觉过的真快,虽然在这挺辛苦,也累,也脏的的一塌糊涂,但感觉还是蛮好的。也曾想过不干...
    憧憬幸福阅读 396评论 0 2
  • 1.感恩杜总每天都在想如何带我们提升生活品质和业绩,男人帮成立了,要更严格要求自己。 2.感恩平安秀姐的督促和影响...
    Hello滑先生阅读 189评论 0 1
  • 沃伦.巴菲特是伯克希尔-哈撒韦公司的董事长,被誉为"股神","价值投资"理念最伟大的践行者,他是本杰明.格雷厄姆在...
    量化简财阅读 1,138评论 1 2