gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:32:05 24 4
gpt4 key购买 nike

我需要解析任意 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com