【发布时间】: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 字符串逐位相同或具有相同的校验和。
标签: ios objective-c