我需要解析任意 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)
关于json - 是否可以重写未知 json 结构中的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47647206/