【问题标题】:Serialize floats to JSON in Swift without dropping decimal在 Swift 中将浮点数序列化为 JSON 而不会丢失小数
【发布时间】:2017-05-03 16:05:26
【问题描述】:

场景:我有一个无模式数据库 API,它根据传入的 json 推断类型。但是,一旦数据库推断出架构,添加到同一表的所有后续条目都必须遵循现有架构。我正在从我的 Swift 应用程序将 json 格式的数据推送到 REST 端点。

我正在使用ObjectMapper 为 Swift 应用程序中的数据定义模式/序列化,例如:

class ExampleDatum: Mappable {

    value: Float?

    init() {
    }

    required init?(map: Map) {
    }

    func mapping(map: Map) {
        value <- map["value"]
    }
}

问题来了,如果value是整数,json格式不带小数点,导致该字段解释为整数/浮点数不一致:

let datum = ExampleDatum()
datum.value = 5.0
print(datum.toJSONString())
>> {"value": 5}

在 JSON 中嵌入此类型信息的最佳做法是什么,例如强制执行小数点总是包括在内?理想情况下类似于{"value": 5.0}

【问题讨论】:

  • 我很惊讶这甚至可以编译。该框架的指定启动器是ExampleDatum(JSON: [String: Any])。这样,您的浮点数将由内置映射器处理。也许这会解决你的问题?
  • 抱歉忘记了默认构造函数,在上面的代码示例中已修复。但是这里的问题是从float序列化到映射的json

标签: json swift serialization floating-point objectmapper


【解决方案1】:

试试

let value = 5.0
let float_string = String(format: "%#f", value)

【讨论】:

  • 这很接近 - 尝试使用 custom transformations 例如(map["value"], TransformOf&lt;Float, String&gt;(fromJSON: { Float($0!) }, toJSON: { $0.map { String(format: "%#f", $0) } })) - 问题是这序列化为字符串,并被数据库端点推断为字符串而不是数字
猜你喜欢
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 1970-01-01
相关资源
最近更新 更多