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

JSON字符串的交集

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

JSON字符串的交集

只需创建一个基于模板和源地图“克隆”地图的函数。

该解决方案将遍历模板映射的条目,并为每一

(k, v)
对在目标映射中生成一个条目,如下所示:

  • 如果

    v
    不是地图,只需
    k
    从源地图获取键的值,然后在目标位置使用它。

  • 如果

    v
    也是一个映射,则递归调用此“克隆”,新模板映射为
    v
    ,新源为
    k
    密钥源中的值。该递归调用的结果将是
    k
    目标映射中键的值。

它看起来像这样:

func procMap(tmpl, src map[string]interface{}) (dst map[string]interface{}) {    dst = map[string]interface{}{}    for k, v := range tmpl {        if innerMap, ok := v.(map[string]interface{}); ok { dst[k] = procMap(innerMap, src[k].(map[string]interface{}))        } else { dst[k] = src[k]        }    }    return dst}

就这样。

测试它:

// tmpljson is the template JSonvar tmpl map[string]interface{}if err := json.Unmarshal([]byte(tmpljson), &tmpl); err != nil {    panic(err)}// srcjson is the source JSonvar src map[string]interface{}if err := json.Unmarshal([]byte(srcjson), &src); err != nil {    panic(err)}dst := procMap(tmpl, src)enc := json.NewEnprer(os.Stdout)enc.SetIndent("", "  ")if err := enc.Enpre(dst); err != nil {    panic(err)}

输出示例JSON(在Go Playground上尝试):

{  "id": "831",  "options": {    "leatherseats": "black",    "sunroof": "full"  }}

笔记:

该解决方案 假定
源映射符合模板。也就是说,如果模板包含某个键的映射,则源映射也应包含相同键的映射。如果不能保证,

procMap()
则应通过检查扩展该函数,以避免运行时出现恐慌,如下所示:

for k, v := range tmpl {    if innerMap, ok := v.(map[string]interface{}); ok {        if src2, ok2 := src[k].(map[string]interface{}); ok2 { dst[k] = procMap(innerMap, src2)        } else { log.Printf("src is not conform to template at key %q", k)        }    } else {        dst[k] = src[k]    }}

还要注意,JSON数组(切片)不会以任何特殊方式处理,这意味着如果模板包含切片,则按原样使用源中的值,并且如果切片包含地图,则不会进行递归。该解决方案也可以轻松扩展为处理切片,这留给读者练习。



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

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

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