问题描述
我正在调用要解组为结构的外部API。
在响应中,大多数字段都是整数,但由于它是json,因此在几种极端情况下,它可以返回字符串,但仍然是有效/有用的信息: “ NaN”,“ N / A”
我的结构看起来像这样:
type Example struct {
Field1 *int64 `json:"field_1,omitempty"`
Field2 *int64 `json:"field_2,omitempty"`
Field3 *int64 `json:"field_3,omitempty"`
}
我们有几个要求:
为此,我尝试用JSON null
来替换“ NaN”值
b = bytes.Replace(b,[]byte("NaN"),[]byte("null"),-1) `
但是它不起作用,因为"null"
不等于null
,这是问题编号1。
第二个问题是,重新编组时,无用性也不区分nil,0和空值。
因此重新编组也失败。我知道在that is being fixed中这是一个“常见”问题,但是现在可以解决吗?
因为如果我为“ N / A”和“ NaN”传递nil并使用omtempty,它将删除它们。如果我传递0,则没有任何意义(从0角度讲,商业意义是“未初始化”以外的含义),如果我删除Omitempty,它将具有 整个结构每次都会编组(大量不必要的数据),并且无法区分nil(NA / NaN)和nil(无值)。
type JSONint64 struct {
value *int64
error string
}
但是这需要我每次检查json响应中的每个数字,而事实上NaN和N / A很少出现,并在前端增加了“复杂性”。
我假设这是一个普遍的问题,因为JSON是无类型的,这通常如何解决?
解决方法
我会Unmarshal到一个 //Create alert
alert = UIAlertController(title: "Logging in",message: "We are logging you in. Please wait for a few seconds...",preferredStyle: .alert)
self.present(alert,animated: true,completion: nil)
DispatchQueue.global(qos: .background).async {
//do task here
}
alert.dismiss(animated: false,completion: nil)
的值,然后使用反射或类型声明来确定值的数据类型。
解组将以下其中一项存储在接口值中:
map[string]interface{}
像这样:
bool,for JSON booleans
float64,for JSON numbers
string,for JSON strings
[]interface{},for JSON arrays
map[string]interface{},for JSON objects
nil for JSON null