将 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"];
创建一个NSNumber
s 数组。原始数组可以包含NSNumber
或NSString
对象。
【讨论】:
我认为他想从 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 数据。最常见的是NSDictionary
或NSArray
,看起来你的可能是NSArray
。
【讨论】:
这并不能解决 OP 的问题——生成的 NSArray 中的数据将是字符串,而不是 NSNumbers。 我不同意。他可以通过调用-doubleValue
方法来取出它们中的任何一个,无论是存储为NSNumber
还是NSString
,作为一个double,NSNumber
或NSString
将响应该方法。无论如何,如果您想访问它们的值,那将是最终目标,因此 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 时出错