如何将浮点值附加为字典中的浮点数?
Posted
技术标签:
【中文标题】如何将浮点值附加为字典中的浮点数?【英文标题】:How to append a float value as float in dictionary? 【发布时间】:2014-12-26 15:15:43 【问题描述】:我需要向服务器计算一个带有 json 值的 MD5 值,例如,
"name":"swift",
"version":1.0,
"edition":1,
"date":"2014-12-26"
在这个 json 中,版本需要以浮点 1.0
而不是 1
发送,版本需要以整数 1
发送。
所以,我尝试创建一个字典并做了一个NSJSONSerialization
,
NSDictionary *d = @@"name":@"swift",
@"version":[NSDecimalNumber decimalNumberWithString:@"1.0"],
@"edition":[NSNumber numberWithInt:1],@"date":@"2014-12-26";
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:d options:0 error:nil];
但这是创建一个 json 响应为
"name":"swift",
"version":1,
"edition":1,
"date":"2014-12-26"
所以MD5
值不匹配。
谁能帮我创建一个带有浮点值的json,用于带有小数点(1.0)
的“版本”?
【问题讨论】:
作为字符串,您可以使用 [NSString stringWithFormat:@"%.1f", 1.f] 获取它,其中 1.f 是您的浮点数。 @zero - 大错特错。数字必须编码为 NSNumber(或 NSDecimalNumber)才能添加到 JSON 对象。如果您将其编码为字符串,它将出现在 JSON 中的引号中,并且将在另一端作为字符串接收,而不是预期的数字。 这样认为(但我从未使用过 JSON)——只是想确保 OP 知道“格式字符串说明符”。 我认为尝试比较数据结构的 JSON 表示的 MD5 总和是不明智的。 JSON 可以以多种不同的方式进行格式化,而不会改变其含义。例如,空格实际上是任意的。 JSON 不区分浮点数和整数。在 Cocoa 的情况下,数字将被包裹在NSNumber
中,据记载它不会保留构造它的原始类型。
是的,在 JSON 上计算校验和的唯一原因是将传输的值与接收的值进行比较,以检测传输过程中的损坏。永远不要期望两个单独构造的 JSON 字符串逐位相同或具有相同的校验和。
【参考方案1】:
在 JSON 中将数值 1.0
简单地发送为 1
并没有错。虽然如果您在 NSNumber 中编码一个浮点数,而不是使用 NSDecimalNumber,那么您获得 .0
可能会有一点运气。
`... @"version":@(1.0)...`
完整的字典:
NSDictionary *d = @@"name":@"swift",
@"version":@(1.0),
@"edition":@(1),
@"date":@"2014-12-26";
【讨论】:
【参考方案2】:创建NSMutableDictionary
,将数字转换为NSNumber
并放入NSMutableDictionary
。
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
float value = 1.0;
NSNumber *number = [NSNumber numberForFloat:value];
[dict setObject:number forKey:@"version"];
或使用文字将上面两行替换为:
dict[@"version"] = @(value);
【讨论】:
以上是关于如何将浮点值附加为字典中的浮点数?的主要内容,如果未能解决你的问题,请参考以下文章