一个特殊的 Json 『美化』工具

1 天前
 liuidetmks

之所以叫美化而不叫格式化,是因为是给人看的,改变了数据结构 

各个业务之间传递数据,喜欢用 jsonstring

传递层级一多,满屏的转义符,没法看了

看了一些 格式化工具,都是保持原来数据结构,以保证程序正确运行为先,没有这种自动美化的

美化后数据不能直接喂给程序哦~~

原始的
{
    "l": 2,
    "v": "{\"l\":1,\"v\":\"{\\\"l\\\":0,\\\"v\\\":\\\"{\\\\\\\"a\\\\\\\":[{\\\\\\\"l\\\\\\\":2,\\\\\\\"v\\\\\\\":\\\\\\\"{\\\\\\\\\\\\\\\"l\\\\\\\\\\\\\\\":1,\\\\\\\\\\\\\\\"v\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\"{\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"l\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\":0,\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"v\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"{\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"value\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"AAAA\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"}\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"}\\\\\\\\\\\\\\\"}\\\\\\\"},{\\\\\\\"l\\\\\\\":1,\\\\\\\"v\\\\\\\":\\\\\\\"{\\\\\\\\\\\\\\\"l\\\\\\\\\\\\\\\":0,\\\\\\\\\\\\\\\"v\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\"{\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"value\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"BBBB\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"}\\\\\\\\\\\\\\\"}\\\\\\\"}],\\\\\\\"value\\\\\\\":\\\\\\\"CCC\\\\\\\"}\\\"}\"}"
}



// 美化后

{
    "l": 2,
    "v": {
        "l": 1,
        "v": {
            "l": 0,
            "v": {
                "a": [
                    {
                        "l": 2,
                        "v": {
                            "l": 1,
                            "v": {
                                "l": 0,
                                "v": {
                                    "value": "AAAA"
                                }
                            }
                        }
                    },
                    {
                        "l": 1,
                        "v": {
                            "l": 0,
                            "v": {
                                "value": "BBBB"
                            }
                        }
                    }
                ],
                "value": "CCC"
            }
        }
    }
}


1021 次点击
所在节点    程序员
8 条回复
wangtian2020
1 天前
有的,把发送字符串 object 的后端打一顿,他就自动美化了
6364v2
1 天前
蹲一个,我也想找个能自动去转义的 json 工具
liuidetmks
1 天前
@wangtian2020 有时候跨业务,甚至跨公司,还是字符串最稳 😂
wangtian2020
1 天前
我对菜 Java Boy 的 PTSD 又要发作了,多找一下后端的麻烦,少找自己的问题
liuidetmks
1 天前
x86
1 天前
可以用 GPT 写一个,"JSON 去除转移缩进美化返回给我"
```json
{
"l": 2,
"v": {
"l": 1,
"v": {
"l": 0,
"v": {
"a": [
{
"l": 2,
"v": {
"l": 1,
"v": {
"l": 0,
"v": {
"value": "AAAA"
}
}
}
},
{
"l": 1,
"v": {
"l": 0,
"v": {
"value": "BBBB"
}
}
}
],
"value": "CCC"
}
}
}
}
```
hellojukay
1 天前
```golang
package main

import (
"encoding/json"
"fmt"
"io"
"os"
)

// recursivelyUnescapeJSON 递归处理嵌套的 JSON 字符串
func recursivelyUnescapeJSON(data interface{}) interface{} {
switch v := data.(type) {
case map[string]interface{}:
// 处理对象
result := make(map[string]interface{})
for key, value := range v {
if key == "v" {
// 特殊处理 "v" 字段中的 JSON 字符串
if strValue, ok := value.(string); ok {
var parsed interface{}
if err := json.Unmarshal([]byte(strValue), &parsed); err == nil {
result[key] = recursivelyUnescapeJSON(parsed)
continue
}
}
}
result[key] = recursivelyUnescapeJSON(value)
}
return result
case []interface{}:
// 处理数组
result := make([]interface{}, len(v))
for i, value := range v {
result[i] = recursivelyUnescapeJSON(value)
}
return result
case string:
return v
default:
return v
}
}

func main() {
// 从标准输入读取所有内容
input, err := io.ReadAll(os.Stdin)
if err != nil {
fmt.Fprintf(os.Stderr, "Error reading from stdin: %v\n", err)
os.Exit(1)
}

// 创建一个通用的 interface{} 来存储任意 JSON 数据
var data interface{}

// 将输入的 JSON 字符串解析为对象
if err := json.Unmarshal(input, &data); err != nil {
fmt.Fprintf(os.Stderr, "Error parsing JSON: %v\n", err)
os.Exit(1)
}

// 递归处理所有嵌套的 JSON 字符串
processed := recursivelyUnescapeJSON(data)

// 将对象重新转换为 JSON 字符串,使用缩进格式化
output, err := json.MarshalIndent(processed, "", " ")
if err != nil {
fmt.Fprintf(os.Stderr, "Error converting back to JSON: %v\n", err)
os.Exit(1)
}

// 输出结果
fmt.Println(string(output))
}

```
houshuu
5 小时 27 分钟前
工作上确实也有类似场景,用 jq 在 zsh 里写个简单的 function 其实就可以了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1093614

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX