【问题标题】: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 字符串逐位相同或具有相同的校验和。

标签: ios objective-c


【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 2014-02-01
      • 2014-07-06
      • 2018-01-23
      • 2021-05-13
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多