代码之家  ›  专栏  ›  技术社区  ›  Reza

如何修复截断字符串json以便能够再次解析

  •  1
  • Reza  · 技术社区  · 4 年前

    我有一个json字符串在谷歌日志中被截断(由于某些无法修复的原因)

    json字符串大约是255000个字符,为简单起见,请考虑原始json如下

     { "a": "1", 
       "b" : [{
          "b1": "<span>text b1</span>"
       },
       {
          "b2": "<span>text b2</span>"
       }],
       "c": "3"
     }
    

    截断的字符串为

     { "a": "1", 
       "b" : [{
          "b1": "<spa... 34 characters truncated.
    

    当然,如果我尝试对上面的字符串进行JSON.parse,我会得到一个错误

    现在,我想的解决方案是使其成为一个有效的json,同时丢失一些数据,这样我期望的输出是

     { "a": "1", 
       "b" : [{
          "b1": "<spa"
        }]
     }
    

    上面所做的是

    • 移除 ... 34 characters truncated. 从字符串末尾开始
    • 通过添加来关闭字符串 " (在这种情况下是需要的,但也可能不需要)
    • 添加足够 ] } 使其再次成为有效对象

    还有其他案件需要处理

    例如

     { "a": "1", 
       "b" : [{
          "b1": ... 34 characters truncated.
    

     { "a": "1", 
       "b" : [{
          "b1 ... 34 characters truncated.
    

    最好的方法是什么?

    我试过了 dirty-json 库需要修复,但实际上这对这种情况没有帮助

    0 回复  |  直到 4 年前
        1
  •  5
  •   Michal Miky Jankovský    2 年前

    npm包 untruncate-json 按预期工作

    import untruncateJson from "untruncate-json";
    
    const string = ` { "a": "1", 
       "b" : [{
          "b1": "<spa... 34 characters truncated.`;
    
    // remove non-json ending
    const truncatedJson = string.replace(/\.\.\. \d+ characters truncated\.$/,'');
    
    // run library
    const untruncatedJson = untruncateJson(truncatedJson);
    
    console.log(untruncatedJson);
    

    输出:

    { 
        "a": "1", 
        "b" : [
            { "b1": "<spa" }
        ]
    }
    
        2
  •  0
  •   Or Assayag    4 年前

    恐怕你得自己做了。但你的方法听起来是个好的开始。