将 JSON ARRAY 转换为 NSNumber 数组

Posted

技术标签:

【中文标题】将 JSON ARRAY 转换为 NSNumber 数组【英文标题】:Converting JSON ARRAY into NSNumber Arrays 【发布时间】:2014-01-13 20:10:06 【问题描述】:

我已从 JSON Web 服务检索数据并将其保存到以下数组中 _soldamount = ( 0, 0, 0, 0, "62.69", "48.3", 81, "59.83", "162.57", 0, "40.67", ) 我相信这个数组被保存为一个字符串。如何将此数组转换为 NSnumbers 数组?感谢您的帮助!

【问题讨论】:

或许您应该显示 JSON 数据。 @MartinR - 不需要。 JSON 数据为["0", "0", "0", "0", "62.69", "48.3", "81", "59.83", "162.57", "0", "40.67"...] 最简单的解决方案可能是遍历您的数组并使用 [NSNumber numberWithFloat:element.floatValue]; 将每个元素从 NSString 转换为 NSNumber; @MartinR 很好地使用了 KVC。每个对象的类从 NSCFConstantString 更改为 NSCFNumber。 @Chris:嗯,它有优点也有缺点。它的代码更少,但是例如键路径中的拼写错误会导致运行时异常,而显式循环中的拼写错误不会编译... 【参考方案1】:
NSArray *_soldamount = @[ @0, @0, @0, @0, @"62.69", @"48.3", @81, @"59.83", @"162.57", @0, @"40.67"];
NSArray *numbers = [_soldamount valueForKey:@"doubleValue"];

创建一个NSNumbers 数组。原始数组可以包含NSNumberNSString 对象。

【讨论】:

我认为他想从 JSON 中获取这些值,而不是硬编码它们。 @Gavin:这只是一个示例,如何将字符串数组转换为数字数组。当然也有可能是我误解了问题。 您正在将小数转换为整数。 这仍然没有回答问题,因为这根本没有解析 JSON。 @Gavin:你可能是对的,这就是我要求“原始”JSON 数据的原因。但是,我现在查看了 user3178926 以前的问题,在我看来,好像 JSON 解析部分已经完成了。 - 也许我们刚刚回答了问题的不同部分。【参考方案2】:

您可以使用以下代码来完成:

NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *e = nil;
id json = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&e];

json 变量中存储的内容将取决于 JSON 数据。最常见的是NSDictionaryNSArray,看起来你的可能是NSArray

【讨论】:

这并不能解决 OP 的问题——生成的 NSArray 中的数据将是字符串,而不是 NSNumbers。 我不同意。他可以通过调用-doubleValue 方法来取出它们中的任何一个,无论是存储为NSNumber 还是NSString,作为一个double,NSNumberNSString 将响应该方法。无论如何,如果您想访问它们的值,那将是最终目标,因此 JSON 是否将它们正确地作为数字返回并不重要。 OP 要求提供一个 NSNumbers 数组。【参考方案3】:

如果打算将这些值存储为数字,则您的 Web 服务应该将它们原样返回。换句话说,带有引号(“)的值是一个字符串,无论该字符串是否为数字。

如果您无法控制 Web 服务并且仍希望将这些值存储为 NSNumbers,则可以使用 [NSNumber numberWithFloat:[string floatValue]] 或者如果字符串可能包含大值或高精度浮点,您可能希望使用 [string doubleValue]价值观。

如果您还没有使用 NSJSONSerialization 类,请参阅 Gavin 的回答。

【讨论】:

【参考方案4】:
NSError *error;
NSDictionary *json = [NSJSONSerialization 
    JSONObjectWithData:responseData
    options:kNilOptions
    error:&error];
NSArray *soldAmount = [json objectForKey:@"amount"]; // Your array of strings.
// Convert string array to number array
NSMutableArray *numberArray = [NSMutableArray array];
[soldAmount enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
    [numberArray addObject:[NSNumber numberWithFloat:[(NSString *)obj floatValue]]];
];

【讨论】:

【参考方案5】:

使用 [NSnumber numberWithInteger:[string integerValue]]

【讨论】:

这并不能满足问题的要求。 它是正确的,虽然它再次犯了整数化小数数据的错误。 不,他有一个字符串,其中包含一个 JSON 块,该块由一个包含值的数组组成。这段代码不会对它做任何事情。我认为在数组上调用integerValue 将返回0,因为它会立即在字符串中遇到非数值。所以他会有一个NSNumber 包含号码0 @Gavin - 我将string 作为数组条目的值。在这种情况下,如果条目是数字,则至少会解析并返回整数部分。

以上是关于将 JSON ARRAY 转换为 NSNumber 数组的主要内容,如果未能解决你的问题,请参考以下文章

NSNumber 值在 JSON 对象转换为数据时发生变化,然后该数据再次转换回 JSON 对象

nsnumber 类型的 json 值“2”无法转换为 nsstring

使用 NSNumberFormatter 和 RestKit 将 NSCFNumber 转换为 NSNumber 时出错

NSJSONSerialization 拆箱 NSNumber?

如何将 NSNumber 转换和比较为 BOOL?

将 NSNumber 转换为 long