栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何解组可以是字符串*或*字符串数组的不一致的JSON字段?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何解组可以是字符串*或*字符串数组的不一致的JSON字段?

使用json.RawMessage捕获变化的字段。

使用json“-”名称对

DisplayName
解码器隐藏字段。顶级JSON解码后,应用程序将填充此字段。

type MyListItem struct {    Datestring          `json:"date"`    RawDisplayName json.RawMessage `json:"display_name"`    DisplayName    []string        `json:"-"`}

解组顶级JSON:

var li MyListItemif err := json.Unmarshal(data, &li); err != nil {    // handle error}

根据原始数据的类型取消对显示名称的编组:

if len(li.RawDisplayName) > 0 {    switch li.RawDisplayName[0] {    case '"':        if err := json.Unmarshal(li.RawDisplayName, &li.DisplayName); err != nil { // handle error        }    case '[':        var s []string        if err := json.Unmarshal(li.RawDisplayName, &s); err != nil { // handle error        }        // Join arrays with "&" per OP's comment on the question.        li.DisplayName = strings.Join(s, "&")    }}

游乐场的例子

将以上内容合并到for循环中以进行处理

MyListings

var listings MyListingsif err := json.Unmarshal([]byte(data), &listings); err != nil {    // handle error}for i := range listings.CLItems {    li := &listings.CLItems[i]    if len(li.RawDisplayName) > 0 {        switch li.RawDisplayName[0] {        case '"': if err := json.Unmarshal(li.RawDisplayName, &li.DisplayName); err != nil {     // handle error }        case '[': var s []string if err := json.Unmarshal(li.RawDisplayName, &s); err != nil {     // handle error } li.DisplayName = strings.Join(s, "&")        }    }}

游乐场的例子

如果数据模型中有多个位置,值可以是字符串或[]字符串,则将逻辑封装为类型可能会有所帮助。在json.Unmarshaler接口的实现中解析JSON数据。

type multiString stringfunc (ms *multiString) UnmarshalJSON(data []byte) error {    if len(data) > 0 {        switch data[0] {        case '"': var s string if err := json.Unmarshal(data, &s); err != nil {     return err } *ms = multiString(s)        case '[': var s []string if err := json.Unmarshal(data, &s); err != nil {     return err } *ms = multiString(strings.Join(s, "&"))        }    }    return nil}

像这样使用它:

type MyListItem struct {    Date        string      `json:"date"`    DisplayName multiString `json:"display_name"`}type MyListings struct {    CLItems []MyListItem `json:"myitems"`}var listings MyListingsif err := json.Unmarshal([]byte(data), &listings); err != nil {    log.Fatal(err)}

操场上的例子



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/446393.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号