json - 是否可以重写未知 json 结构中的字符串?

标签 json go

我需要解析任意 json,编码/重写任何长度超过 85 个字符的字符串键或值(想想一种短 URL 服务)并将其编码回原始 json。 例如像这样的文档 {"Name": "Ed", "Text": "long characters....85 chars"} 应该变成这样的 {"Name": "Ed ", "文本": "short://ID=3403"}。这个例子很简单,但我必须处理具有嵌套对象和数组以及基本未知结构的复杂结构。

我的问题是:是否可以使用已知的库甚至标准的 encoding/json 包来做到这一点? 我真正需要的是相当于 Marshaler 的实现。 type string 上的接口(interface),但我们知道这是不可能的,所以我想知道我还有什么其他选择(除了 fork 标准编码/json 包)

最佳答案

是的,使用标准库和一些代码是可能的。

解码到接口(interface){}

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

遍历未编码的值,缩短字符串并在进行时重写:

func shorten(v interface{}) interface{} {
    switch v := v.(type) {
    case []interface{}:
        for i, e := range v {
            v[i] = shorten(e)
        }
        return v
    case map[string]interface{}:
        m := make(map[string]interface{})
        for k, e := range v {
            m[shortenString(k)] = shorten(e)
        }
        return m
    case string:
        return shortenString(v)
    default:
        return v
    }
}

函数shorten电话 shortenString(s string) string将长字符串转换为 short://ID=xxx .

将值编码回 JSON:

p, err := json.Marshal(shorten(v))
if err != nil {
    // handle error
}

// p is a []byte
fmt.Printf("%s\n", p)

playground example

关于json - 是否可以重写未知 json 结构中的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47647206/

相关文章:

java - 跨平台 JSON 构造型/序列化器对类型属性使用react? (Java/Objective-C)

javascript - JSON.parse() : SyntaxError: Unexpected token � in JSON at position 0

debugging - 如何获取 panic 的堆栈跟踪(并存储为变量)

google-app-engine - 如何使用 Go 删除​​ App Engine 上的搜索索引?

Golang 生成一个 32 字节的 key

sql - 使用 PostgreSQL 选择 json 中的特定条目

ios - 解析来自 JSON 和 ios 的响应?

c# - JSON 数字根到通用名称

amazon-web-services - 使用 golang 的 AWS S3 并行下载

go - 是否可以在 go 中覆盖自动格式化程序