使用json.RawMessage处理api返回时部分字段类型不定的情况

背景

当遇到请求的api返回数据结构中,部分字段的类型不能确定时,可以在定义结构体该字段时,指定其类型为json.RawMessage,
这样当从api取返回数据时,json.Unmarshal后,该字段仍然是[]byte类型,而我们可以对这一个字段再做针对性的处理。
/*
{
“type”:“File”,
“data”:{
“filename”:“this is a file”
}
}
{
“type”:“Persons”,
“data”:[{
“age”:12,
“sex”:1
},
{
“age”:11,
“sex”:2
}]
}
//如api返回的结构中,data字段可能是上边这两种
*/

代码

package jsonPrac

import "encoding/json"

type Response struct {
   Type   string
   Data   json.RawMessage
}

type File struct {
   FileName string
}

type Person struct {
   Age int
   Sex int
}

type Persons []*Person

func PPP(input string)  {
   ss := Response{}
   if err := json.Unmarshal([]byte(input), &ss); err != nil {
      panic(err)
   }
   switch ss.Type {
   case "File":
      var f File
      if err := json.Unmarshal(ss.Data, &f); err != nil {
         panic(err)
      }
      println(f.FileName)
   case "Persons":
      var p Persons
      if err := json.Unmarshal(ss.Data, &p); err != nil {
         panic(err)
      }
      println(p[0].Age)
   }
}
//main.go
func main() {
   input  :=`{"type": "File","data": {"filename": "for test"}}`
   input1 :=`{"type": "Persons","data": [{"age": 12, "sex":10},{"age":100, "sex":99}]}`
   jsonPrac.PPP(input)
   jsonPrac.PPP(input1)
}

输出

for test
12

在前端处理传参使用 `JSON.stringify()` 将对象转换为 JSON 字符串,可能会遇到非法字段的问题。这通常是因为对象中包含了不能被 JSON 格式化的数据类型或非法的字段。 以下是一些常见导致非法字段问题的情况以及解决方法: 1. 循环引用:如果对象中存在循环引用,即某个属性指向了对象自身或形成了循环引用链,`JSON.stringify()` 无法处理循环引用,会抛出错误。解决方法是在转换之前将循环引用的属性设置为 `null` 或移除。 2. 函数或方法:如果对象中包含了函数或方法,`JSON.stringify()` 无法将其序列化为 JSON 字符串,会被忽略掉或转换为 `null`。解决方法是在转换之前将函数或方法从对象中删除。 3. 非法的字段名:如果对象中包含了非法的字段名,比如包含了保留关键字、包含了特殊字符等,`JSON.stringify()` 会忽略这些字段。解决方法是使用合法的字段名或进行字段名的转义。 4. 不支持的数据类型:`JSON.stringify()` 无法处理某些特殊的数据类型,比如 `undefined`、`Date` 对象、正则表达式等。解决方法是在转换之前将这些数据类型转换为合法的 JSON 数据类型,或者自定义转换逻辑。 在处理传参,建议在使用 `JSON.stringify()` 之前对对象进行适当的处理和检查,确保对象中不包含非法字段。你可以使用递归或其他方法来遍历对象并处理其中的特殊情况,以确保能够成功地将对象转换为 JSON 字符串。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值