• 请不要在回答技术问题时复制粘贴 AI 生成的内容
liuidetmks
V2EX  ›  程序员

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

  •  
  •   liuidetmks · Nov 29, 2024 · 2709 views
  •   You need to sign in to view this topic
    This topic created in 681 days ago, the information mentioned may be changed or developed.

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

    各个业务之间传递数据,喜欢用 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"
                }
            }
        }
    }
    
    
    
    Supplement 1  ·  Nov 29, 2024

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

    8 replies  •  2024-11-30 13:26:00 +08:00
    wangtian2020
        1
    wangtian2020  
       Nov 29, 2024   ❤️ 2
    有的,把发送字符串 object 的后端打一顿,他就自动美化了
    yrhhh
        2
    yrhhh  
       Nov 29, 2024
    蹲一个,我也想找个能自动去转义的 json 工具
    liuidetmks
        3
    liuidetmks  
    OP
       Nov 29, 2024
    @wangtian2020 有时候跨业务,甚至跨公司,还是字符串最稳 😂
    wangtian2020
        4
    wangtian2020  
       Nov 29, 2024
    我对菜 Java Boy 的 PTSD 又要发作了,多找一下后端的麻烦,少找自己的问题
    liuidetmks
        5
    liuidetmks  
    OP
       Nov 29, 2024
    x86
        6
    x86  
       Nov 29, 2024
    可以用 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"
    }
    }
    }
    }
    ```
    Nexora
        7
    Nexora  
       Nov 29, 2024
    ```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))
    }

    ```
    fang2hou
        8
    fang2hou  
       Nov 30, 2024 via iPhone
    工作上确实也有类似场景,用 jq 在 zsh 里写个简单的 function 其实就可以了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3089 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 12:54 · PVG 20:54 · LAX 05:54 · JFK 08:54
    ♥ Do have faith in what you're doing.