iOS 说不能解析这样的 JSON?

2019-01-11 10:38:45 +08:00
 salamanderMH

题目描述

返回的 json 格式如下

{
    "status": 1,
    "content": "get seats info successfully !",
    "data": {
        "seats": {
            "1": {
                "nickname": "salamander",
                "avatar": "*******************",
                "uid": 5464
            },
            "3": {
                "nickname": "coopk、",
                "avatar": "***********************",
                "uid": 54645645
            }
        }
    }
}

他说,seats中的数据不能以 1,3 这样的数字,无法解析,请教一下大家

5990 次点击
所在节点    问与答
74 条回复
OctWu
2019-01-11 13:46:30 +08:00
@cnbobolee model 也能解析啊。恶心而已
0x000007
2019-01-11 13:58:48 +08:00
@OctWu 他的意思是 key 不固定的话,model 的属性就没法定吧
cnbobolee
2019-01-11 14:07:21 +08:00
@OctWu 快告诉我,怎么定义这样的 model,我以前也遇到过这样的设计,就是不知道 seats 下面定义个什么字段?
OctWu
2019-01-11 14:24:04 +08:00
@cnbobolee 我上面写了啊 #39
OctWu
2019-01-11 14:25:06 +08:00
@0x000007 看这数据是个订座之类的需求。为啥要 key 固定。。。key 就是座位号。value 就是顾客。
没看明白
0x000007
2019-01-11 14:42:07 +08:00
struct Fuck: Codable {
var seats: [String: User]
}
转成这样的 model 有什么意义么?直接用[String: User]不是更好么.
我想楼主的同事是要转成这样的 model
struct Seats: Codable {
var key1:User
var key2:User
}
首先这样做肯定是不对的,所以我说 key 不固定的话是没法弄得
CommandZi
2019-01-11 14:50:55 +08:00
@cloverstd 肯定是"1",我朋友公司的 PHPer 会返回 {"0": "xx", "1": "xxx"} 这样的 JSON。
OctWu
2019-01-11 14:52:36 +08:00
@0x000007 这有什么没意义的。我说了能解,只是恶心而已。

然后下面的那个例子,你自己看下不就是个字典么,你自己都写出来了。

另外根本就不需要 key 固定,这需求我说了看着就是个订座之类的。不是知道多少号坐,坐的谁就行了么,10 个坐的时候写 10 个 property, 加了 11 个,还需要客户端发版么。

Fuck().seats.enumerator().forEach 不好么
icyalala
2019-01-11 14:56:10 +08:00
iOS 解析 JSON,一般都是用一些 JSON-Model 的库来自动处理,并转换为对象的。
那么对象的属性(变量名称)是不可能使用数字的,所以自动处理肯定无法完成。
这种情况下,只能手动去处理,非常麻烦而且容易出错。

另外,#11 楼才是正确做法。
Damon4V
2019-01-11 14:56:21 +08:00
楼主改下吧,你这样的动态 key,随便哪一端解析都麻烦,会被喷的:-O
OctWu
2019-01-11 14:56:32 +08:00
@0x000007 另外有个前提是人家要转 model 啊。我只是提出解决方案,尽可能保证合理,要不就让开发去怼后台呗。
0x000007
2019-01-11 14:58:09 +08:00
@OctWu 我知道那是字典啊,人家同事想转成这样的 model,不是我要这么做啊,我只是想表达,如果要转成这样的 model,key 不固定根本就没法做嘛
0x000007
2019-01-11 14:59:55 +08:00
@OctWu 也不是我想表达,是表达 20 楼的意思😂
greenskinmonster
2019-01-11 15:11:24 +08:00
我也搞过类似的结构,我们 ios 开发也跟我说过 ios 没法自动处理,需要特殊处理下。

我的目的是让 "1" 这个 key 的数据只有一份,类似于 map 的 key。
每次 put 的时候不需要再去轮询一遍,检查 id=“ 1 ”的有没有存在,直接 put 就好。

其实我不明白的是 ,1 是数字,“ 1 ” 是字符串,根本是两回事,干嘛要混为一谈。
rumengzhenxing
2019-01-11 15:22:34 +08:00
可以解析,但是这种格式拿出去不管 IOS 还是 Android 都会怼你的。
bumz
2019-01-11 15:27:23 +08:00
json 不能用 number 做 key,但 numeric 的字符串可以
然而如果要把 json object 变成对象,key 还得是符合英文字母下划线开头的。。。也就是说连 numeric 的字符串都不可以
bumz
2019-01-11 15:28:59 +08:00
至于这种情况,合理的做法显然是用 "seat1", "seat2", ..., "seat6" 来命名
只有 6 个可能不需要哈希表
cnbobolee
2019-01-11 15:32:41 +08:00
@OctWu 那个 map 忽悠我,当我刚毕业的小学僧
StubbornC
2019-01-11 15:34:45 +08:00
楼主写 PHP 的吧,我们老项目也有这种结构的 JSON,被我和安卓同事狂喷好几次
greenskinmonster
2019-01-11 15:43:44 +08:00
@rumengzhenxing #55

不是应该去怼 IETF,https://www.ietf.org/rfc/rfc4627.txt ,让他们改标准吗?禁止不合法变量 /函数名做 key 吗,综合 java/javascript/c/c++/go 等各种语言的要求。

@bumz #56 这是个成本不高的这种折中解决办法。然而我对框架不能支持标准,还振振有词表示不能理解。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/525932

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX