作者fightword (呼啦啦~)
看板MacDev
标题[问题] json的顺序问题
时间Wed Apr 29 16:53:21 2015
补充3:
似乎有人有同样问题
google "OrderedDictionary ios"
有兴趣的人也可以看看罗
补充2
找了一个晚上 似乎不改资料面应该是无解了
找google还满多人有同样的问题
但最终都是妥协改资料面为array
http://ppt.cc/8NHV
其实同样的问题
就算不是json 若是从plist读进来
NSDictionary的allkeys也是不会按顺序
目前先朝利用人脉去改server端的回传格式好了(哭
补充:
如果资料如下
{
"Level": "3",
"Name": "testLogger",
"IPADDRESS": "testMachiene",
"Message": "hiiiiiiiiii",
"TimeStamp": "test12345678"
}
转成NSDictionary时有可能会变成如下(顺序不同):
{
"Name": "testLogger",
"TimeStamp": "hiiiiiiiiii",
"Message": "test12345678",
"Level": 3,
"IPADDRESS": "testMachiene"
}
我明白json有定义若为一群object
本来就没有确保顺序
有方法可以确保顺序吗?
========================
请问一下
在ios作解析json的资料时
若资料是很多object而不是用array包起来
"有方法"在转成NSDictionary时,
NSDictionary里的顺序跟json的资料里的顺序一样吗?
效能差一点没关系
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.32.190.119
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/MacDev/M.1430297603.A.B7B.html
1F:推 neotek: 怎麽看不太懂 04/29 16:57
2F:→ neotek: 你是用NSJSONSerilizer把string转json? 04/29 17:14
3F:→ yr: NSDictionary 算是 hash table ,没什麽顺序不顺序的 04/29 17:14
4F:→ yr: 不在意效能你可以改用 NSArray 来存 04/29 17:15
5F:→ darktt: 问题是Dictionary的顺序有差别吗?用key就可以控制顺序啊 04/29 19:00
某些原因,APP的呈现面需按照server给的资料顺序
我试过用android可以 但ios似乎一定会乱排,可能是为了效能吧
6F:→ darktt: 不然就将key按顺序装进array,之後用for in取值就好了 04/29 19:03
key值是动态的(可能为a, b, c也可能是 e, f g, 不一定,
所以没有规则可以在client先排序)
我是用allkeys取得所有的key:
NSDictionary* dataJSON = (server端取回来的资料);
NSArray *keys = [dataJSON allKeys];
这边取出key就没有按顺序了
8F:→ yuanruo: 都存到Dictionary里了 顺不顺序根本没差吧 04/29 22:10
9F:→ yuanruo: 你是用key去取值又不是用回圈去取Dictionary里的值 04/29 22:11
10F:→ howdiun: JSON改成[{XX:XX},{XX:XX}]的格式或是加入order的参数 04/30 09:09
我知道资料面改成array就解了 但..一些原因改资料是最後解
11F:推 neotek: allkeys本来就不会有顺序呀~~请参考文件 04/30 09:58
13F:→ neotek: The order of the elements in the array is not defined. 04/30 09:58
这我早就知道了哦 所以才想问有没有能取出原顺序的方法
14F:→ nobody1: 多一个栏位"sort" 再自已去排 04/30 10:38
15F:→ yr: 这就是典型的用错资料结构又不知道,然後又想从这个用错的 04/30 13:24
16F:→ yr: 资料结构去输出成自己想要的输出。 04/30 13:24
17F:→ yr: 要不你自己想办法排序,要不换资料结构,自己挑一个。 04/30 13:25
yr的火气很大哦?
这资料虽然是别人给的
但我觉得并不能算错
因为从别的角度它有其他优点 什麽样的优点就不提了
一件事没那麽只有2面
anyway
找到一篇看似的解法
google "OrderedDictionary ios"
也有其他人有同样的问题
若有人有类似问题也可以从这个角度去看
18F:推 neotek: 原始资料应该是String拿下来之後再转JSON吧 04/30 14:13
19F:→ neotek: 用regex把key筛出来,存进array,dictionary顺序不管他 04/30 14:14
20F:→ neotek: 之後要取value,用for in把key找出来,再去dict取 04/30 14:14
是没错 是先转成NSString
请问一下regex要怎麽取key呢?
有什麽方向可以看吗?
21F:→ neotek: 不过最简单还是加一个order栏位吧~~ 04/30 14:16
其实是钱的问题啦 加一个order要多花钱
且Android(java有语法可用)可以 公司就不想为了ios特别额外出钱
※ 编辑: fightword (114.32.190.119), 04/30/2015 14:25:30
24F:→ neotek: 我假设你回来的资料都是用array包起来的object 04/30 14:49
25F:→ neotek: 全部都是dictionary应该也可以, 关键是取每个object出来 04/30 14:50
26F:→ neotek: 我是用"},"当作分隔,你的资料长怎样我就不知道了 04/30 14:50
27F:→ neotek: 所以要确保每笔object可以正确分开来,接下来就没啥问题了 04/30 14:51
28F:→ neotek: 我不太会写regex,所以不会把每笔object的key group起来o_o 04/30 14:52
29F:→ neotek: 剩下就交给版上神人惹 04/30 14:52
30F:推 Blueshiva: sever不给你order,自己建就好啦...反正抓回来的就是字 04/30 15:24
31F:→ Blueshiva: 串,自己把所有的key抓出来,然後再把字串丢去转成Dic 04/30 15:24
32F:→ Blueshiva: 最後再自己加个order的key到这个dic去 04/30 15:25
33F:→ Esvent: parse的时候顺便把顺序记起来就可以了吧? 05/01 13:06
34F:推 Blueshiva: 问题是现在绝大多数人都是用lib解json,大概都忘记这东 05/01 17:21
35F:→ Blueshiva: 西可以自己做... 05/01 17:21