将 JSON 中的蛇形大小写键转换为 Go 中的驼峰式大小写
问题:
中那么,我们如何才能将 JSON 中的 Snake_case 键递归转换为 CamelCase 键呢?这对于在从 Elasticsearch 等数据存储接收数据时将 API 响应 JSON 与内部标准保持一致尤其相关,其中关键格式可能会有所不同。
答案:
要实现此目的转换时,我们可以利用多种方法。一种有效的方法利用 Go 1.8 的功能,即定义两个具有不同字段标签的结构体。通过精心设计标签,我们可以毫不费力地在两个结构之间进行转换,有效地应用所需的键转换。
使用标签的代码示例:
<code class="go">package main import ( "encoding/json" "fmt" ) type ESModel struct { AB string `json:"a_b"` } type APIModel struct { AB string `json:"aB"` } func main() { b := []byte(`{ "a_b": "c" }`) var x ESModel json.Unmarshal(b, &x) b, _ = json.MarshalIndent(APIModel(x), "", " ") fmt.Println(string(b)) }</code>
基于递归映射的方法:
另一个全面的策略涉及尝试将 JSON 文档解组为映射。如果操作成功,我们就可以有条不紊地纠正键,并为每个映射值递归执行键转换函数。以下示例说明如何将所有键转换为大写。在您的实现中,fixKey函数应该替换为snake_case转换函数。
<code class="go">package main import ( "bytes" "encoding/json" "fmt" "strings" ) func main() { // Document source as returned by Elasticsearch b := json.RawMessage(`{ "a_b": "c", "d_e": ["d"], "e_f": { "g_h": { "i_j": "k", "l_m": {} } } }`) x := convertKeys(b) buf := &bytes.Buffer{} json.Indent(buf, []byte(x), "", " ") fmt.Println(buf.String()) } func convertKeys(j json.RawMessage) json.RawMessage { m := make(map[string]json.RawMessage) if err := json.Unmarshal([]byte(j), &m); err != nil { // Not a JSON object return j } for k, v := range m { fixed := fixKey(k) delete(m, k) m[fixed] = convertKeys(v) } b, err := json.Marshal(m) if err != nil { return j } return json.RawMessage(b) } func fixKey(key string) string { return strings.ToUpper(key) }</code>
以上是如何在 Go JSON 中将蛇形命名法键转换为驼峰式命名法?的详细内容。更多信息请关注PHP中文网其他相关文章!