如何将相同的值编组和解编为不同类型的结构?

问题描述

我正在调用要解组为结构的外部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