如何解决如何将相同的值编组和解编为不同类型的结构?
我正在调用要解组为结构的外部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"`
}
我们有几个要求:
-
如果api返回NaN或N / A,我应该在FE中向用户显示错误,因此我正在考虑在“捕获”错误时将值替换为null 这就是为什么我选择了指针值的原因。
-
如果未返回任何值,则在重新编组时完全忽略该值。
为此,我尝试用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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。