V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liuidetmks
V2EX  ›  程序员

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

  •  
  •   liuidetmks · 8 天前 · 1290 次点击

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

    各个业务之间传递数据,喜欢用 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"
                }
            }
        }
    }
    
    
    
    第 1 条附言  ·  8 天前

    忘记 附加地址了
    JSON 美化链接

    8 条回复    2024-11-30 13:26:00 +08:00
    wangtian2020
        1
    wangtian2020  
       8 天前   ❤️ 2
    有的,把发送字符串 object 的后端打一顿,他就自动美化了
    6364v2
        2
    6364v2  
       8 天前
    蹲一个,我也想找个能自动去转义的 json 工具
    liuidetmks
        3
    liuidetmks  
    OP
       8 天前
    @wangtian2020 有时候跨业务,甚至跨公司,还是字符串最稳 😂
    wangtian2020
        4
    wangtian2020  
       8 天前
    我对菜 Java Boy 的 PTSD 又要发作了,多找一下后端的麻烦,少找自己的问题
    liuidetmks
        5
    liuidetmks  
    OP
       8 天前
    x86
        6
    x86  
       8 天前
    可以用 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
        7
    hellojukay  
       8 天前
    ```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
        8
    houshuu  
       7 天前 via iPhone
    工作上确实也有类似场景,用 jq 在 zsh 里写个简单的 function 其实就可以了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1069 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 23:59 · PVG 07:59 · LAX 15:59 · JFK 18:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.