【问题标题】:Converting NSData (Json data) to nsarray : iOS将 NSData(Json 数据)转换为 nsarray:iOS
【发布时间】:2014-05-27 14:26:49
【问题描述】:

我正在从 WebService 获取一些数据(这是一个 json 数据)

Webservice 发送的确切输入是:

[
    {
        "id": "C-62",
        "title": "testing testing",
        "type": "image",
        "thumb": "",
        "LinkId": "ABC",
        "fileSize":1074,
        "level":0,
    },
    {
        "id": "C-63",
        "title": "testing ab testing",
        "type": "audio",
        "thumb": "",
        "LinkId": "ABCD",
        "fileSize":1074,
        "level":1,
    }

]

正如我在输入数据中看到的,只有 fileSize 是整数类型的键值对 其余都是字符串格式。

当我使用以下代码将该 NSData 转换为 NSArray 时

 NSArray *dataArray = nil;

  dataArray = [NSJSONSerialization JSONObjectWithData:data
                                                     options:0
                                                       error:nil];

我得到这样的“dataArray”

{
            "id": "C-62",
            "title": "testing testing",
            "type": image,
            "thumb": "",
            "LinkId": "ABC",
            "fileSize":1074,
            "level":0,
        },
        {
            "id": "C-63",
            "title": "testing ab testing",
            "type": audio,
            "thumb": "",
            "LinkId": "ABCD",
            "fileSize":1074,
            "level":1,
        }

“type”键值对变为“int”。所有其他键值对都处于相同状态。

请帮助我将输入数据转换为与 Web 服务发送的相同格式。 我正在使用 iOS 7。

【问题讨论】:

  • “类型”值在我看来是一个 NSString。 (当你对一个 NSDictionary 进行 NSLog 记录时,不包含空格或“奇数”字符的字符串值将被打印,并且不包含双引号。)
  • 事实上,知道了 NSLog 输出的特征,我可以看出你的底部列表不是 NSLog 输出的复制/粘贴,而只是编辑的 JSON 文本。
  • @HotLicks 感谢您的回复。你的第一条评论真的很有帮助。您可以将其发布为答案。真正的问题是。在某些情况下,'fileSize' 是任意大的。需要被视为 long long int。

标签: ios json ios7


【解决方案1】:

你只是把自己弄糊涂了。您将 NSLog 输出与实际存储的内容混淆了。当您声称只有“fileSize”字段包含数字时,您也没有说实话,因为显然“level”字段也是如此。

NSLog 仅在必要时显示带引号的字符串。字符串“10”将显示为没有引号的 10。你真的可以依靠 NSJSONSerializer 而不在你背后做任何事情。

【讨论】:

  • 感谢'Hot Licks 解决了我的问题' 的回复.cmets。是的,我有点困惑:)
【解决方案2】:

NSJSONSerialization 将标量数字转换为 NSNumbers。这是它们可以参与集合(数组和字典)的唯一方式。要转换为 int,请访问 NSNumber 并将其转换如下...

NSArray *dataArray = // the de-serialized json
NSDictionary *dictionary = dataArray[0];  // the first dictionary
NSNumber *number = dictionary[@"fileSize"];

// turn an NSNumber representing an integer to a plain int
int fileSizeInt = [number intValue];

但不要尝试将该 int 重新插入到字典中。

【讨论】:

  • 在 JSON 中使用 NSNumber 唯一真正敏感的事情是非常大的整数,因为它们可能被编码为 NSDecimalNumber,如果你不这样对待它们,你可能会失去精度。
  • @danh 感谢您的回复。'Hot Licks' 的评论解决了我的问题。
【解决方案3】:

iOS 上 JSON 的一个棘手问题是找出任意 NSNumber 的数据类型。我在this question 中记录了我的困难。

一个大数可能是浮点数或整数,如果您在真正拥有另一个时尝试提取一个,则会丢失有效数字。而且,显然(回想起来),如果您将一个太大的值提取到 int 中,您将丢失高位并得到完全错误的值。

(如果您事先知道某些值属于某些类型,这并不难。那么只需使用正确的“动词”来提取预期的值类型即可。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多