如何编组和转义引号

How to marshal and escape quotes

我正在整理一个 map[string]interface{} 并得到一个 json:

{
    "test": {
        "test2": 123
    }
}

在某些情况下 interface{} 我有另一个 map[string]interface{}

有什么方法可以编组它并转义双引号以获得这样的 json 吗?

{
    "test": "{
        \"test2\": 123
    }"
}

(假设您不关心所需输出中的换行符)- 一种方法是遍历地图中的每个值,并将它们编组为 json 字符串首先,使用标准的 json.Marshal 函数。然后将这些字符串添加回您的原始地图(如果您愿意,也可以添加新地图)。现在你有了一个映射,其中的值实际上是原始值的 json 字符串表示,你可以将这个外部映射编组为 json,编码器将为你转义值字符串中的任何双引号. 看这个例子

package main

import (
    "fmt"
    "encoding/json"
)

var yourMap = map[string]interface{}{
    "a": 1,
    "b": map[string]interface{}{
        "c": 2,
    },
}


func transform(m map[string]interface{}) (map[string]interface{}, error) {
    newMap := make(map[string]interface{})
    for k, v := range m {
        bytez, err := json.Marshal(v)
        if err != nil {
            return nil, err
        }
        newMap[k] = string(bytez)
    }
    return newMap, nil
}

func main() {
    newMap, err := transform(yourMap)
    if err != nil {
        panic(err)
    }

    b, err := json.Marshal(newMap)
    if err != nil {
        panic(err)
    }

    fmt.Println(string(b))
}

封装上述逻辑的一种更简洁的方法可能是为您的地图声明一个新的命名类型,并在该新类型的 Marshal 方法中实现自定义编组。