登录
首页 >  Golang >  Go问答

从 JSON 字符串中提取有效 JSON 数据的最佳方法

来源:stackoverflow

时间:2024-03-22 12:10:30 137浏览 收藏

为了从设备日志中提取有效 JSON 数据,本文探讨了处理 JSON 字符串中存在无效字符(如 \134、\M、\t)的方法。这些字符会阻碍 JSON 解析,导致错误。本文提供了两种解决方案:使用正则表达式将无效八进制转义序列替换为空格,或解析八进制值并将其转换为有效的 JSON 转义序列。通过这些方法,可以自动检测并删除无效字符,从而顺利解析 JSON 数据。

问题内容

为了提供一些背景信息,我正在使用 adb logcat 和 idevicesyslog 从 android 和 ios 设备读取设备日志。我之后的具体日志是通过 adb logcat / idevicesyslog 转换为字符串的 swift/c#/java/etc 字典。我希望获取这些包含类似 JSON 字符串的日志,并将其转换为有效的 JSON。这在大多数情况下都没有问题。

但是,有时这些日志/字符串输出包含(\134、\M、\t 等)等字符,这些字符在解组为 JSON 时会导致问题。我将它们解组为 JSON 以将它们发送到其他地方。

例如,原始设备日志可能具有如下内容: {"foo":"bar","foo":"bar\134/\134/bar\134/bar\134/bar"} {"foo":"bar","foo":"bar\M/\134/bar\134/bar\M/bar"}

尝试解组时,这些会导致错误,例如“恐慌:字符串转义代码中的字符‘M’无效”

大多数日志不包含这些字符,因此这不是问题。然而,一些边缘情况包含这些并且会产生问题。

这些类型的字符有合适的名称吗? (c#转义字符?)是否有一个golang包可以从字符串中删除它们?目前,我只是删除我遇到的特定字符串(如果它们出现在字符串中),但我觉得有更好的方法来做到这一点。将我遇到的字符添加到可删除字符列表中并不是一个好的做法。

总结一下,

idevicesyslog 日志给了我一个像这样的字符串: {"foo":"bar","foo":"bar\134/\134/bar\134/bar\134/bar"}

这无法被解组。

idevicesyslog 日志给了我一个像这样的字符串: {"foo":"bar","foo":"酒吧酒吧酒吧酒吧"}

这可以被解组。

当前解决方案:将我遇到的新解决方案添加到列表中,并在解组之前将其删除

有希望的解决方案:自动检测并删除


解决方案


使用正则表达式将无效的八进制转义序列替换为空格:

var octalescapepat = regexp.mustcompile(`\\[0-7]{3}`)

func fix(src string) string {
    return octalescapepat.replaceallstring(src, " ")
}

您还可以解析八进制值并转换为有效的 json 转义序列:

func fix(src string) string {
    return octalEscapePat.ReplaceAllStringFunc(src, func(s string) string {
        // Parse octal value
        n, _ := strconv.ParseInt(s[1:], 8, 0)
        // Convert to string and marshal to JSON to handle any escaping
        b, _ := json.Marshal(string(n))
        // return string with surrounding quotes removed
        return string(b[1 : len(b)-1])
    })
}

\m 可以用类似的方式处理。

https://play.golang.org/p/-gtxrvnBSrx

终于介绍完啦!小伙伴们,这篇关于《从 JSON 字符串中提取有效 JSON 数据的最佳方法》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>