首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用SED将字符串转换为有效的JSON

用SED将字符串转换为有效的JSON
EN

Stack Overflow用户
提问于 2022-11-28 18:23:09
回答 1查看 42关注 0票数 0

我有一些sudo-json /随机字符串从一个端点返回,其中缺少双引号,一些逗号在例如, ,之间没有任何逗号,还有一些字段没有值。示例:

代码语言:javascript
运行
复制
{issuingColo=1, csUserId=0, expirationTimestamp=2022-11-28 15:53:51.754, sessionId=0, isImpersonator=false, loginSession=1737438, identities=urn:thing:123 , urn:thing:456(urn:thing:account:123,234) , urn:li:thing:123 , , keyVersion=6, tokenVersion=9, permissions=, midToken=123, loginTimestamp=2022-11-28 14:53:49.705, isUser=false, memberId=5555}%

我试图将其更改为有效的json,以将其传递给jq。我试过这样的方法:

代码语言:javascript
运行
复制
sed 's/\b\([\w:.-]*\)\b/"\1"/g'

但这似乎什么都没做。如果我错过了什么,我会很感激的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-29 01:36:57

我对JSON没有任何经验,但作为一项调整格式以适应JSON的练习,我已经将以下不处理嵌套大括号的逻辑组合在一起(我将为将来研究这一点)。但是对于您提供的单行,这是非常错误的,我已经提出了下面的“转换器”脚本,如果这是由您正在使用的一些固定实用程序生成的格式。

最后一行的逗号不应该出现,因为它是“数组”中的最后一个元素。这是唯一不符合JSON标准的项。

我还认为,您的尾随"%“是无关的,但是我已经将它与此代码放在一起了。这是很容易重新加工的。

因此,下面是值得学习的代码:

代码语言:javascript
运行
复制
#!/bin/bash

#QUESTION:  https://stackoverflow.com/questions/74604942/sed-convert-bad-json-to-valid

echo '{issuingColo=1,  csUserId=0,   expirationTimestamp=2022-11-28 15:53:51.754, sessionId=0, isImpersonator=false, loginSession=1737438, identities=urn:thing:123 , urn:thing:456(urn:thing:account:123,234) , urn:li:thing:123 , , keyVersion=6, tokenVersion=9, permissions=, midToken=123, loginTimestamp=2022-11-28 14:53:49.705, isUser=false, memberId=5555}%' |
    sed 's+{+{\n+g' |
    sed 's+}+\n}\n+g' |
    sed 's+\ ,+,+g' |
    sed 's+,,+,+g' |
    sed 's+^[ ]*++g' |
awk 'BEGIN{
    defer=0 ;
}{
    if( index( $0, "=" ) == 0 ){
        print $0 ;
    }else{
        n=split( $0, seg, ", " ) ;
        for( i=1 ; i<=n ; i++ ){
            gsub( /^ *| *$|/, "", seg[i] ) ;
            if( index( seg[i], "=" ) == 0 ){
                if( index( seg[i], "urn:" ) == 1 ){
                    printf(",\"%s\"", seg[i] ) ;
                    defer=1 ;
                }else{
                    printf("\"%s\",\n", seg[i] ) ;
                } ;
            }else{
                if( defer == 1 ){
                    print "]," ;
                    defer=0 ; 
                } ;
                p=index( seg[i], "=" ) ;
                beg=substr( seg[i], 1, p-1 ) ;
                rem=substr( seg[i], p+1 ) ;
                if( index( rem, "urn:" ) == 1 ){
                    printf("\t\"%s\": [\"%s\"", beg, rem ) ;
                    defer=1 ;
                }else{
                    printf("\t\"%s\": \"%s\",\n", beg, rem ) ;
                } ;
            } ;
        } ;
    } ;
}'

产出如下:

代码语言:javascript
运行
复制
{
    "issuingColo": "1",
    "csUserId": "0",
    "expirationTimestamp": "2022-11-28 15:53:51.754",
    "sessionId": "0",
    "isImpersonator": "false",
    "loginSession": "1737438",
    "identities": ["urn:thing:123","urn:thing:456(urn:thing:account:123,234)","urn:li:thing:123"],
    "keyVersion": "6",
    "tokenVersion": "9",
    "permissions": "",
    "midToken": "123",
    "loginTimestamp": "2022-11-28 14:53:49.705",
    "isUser": "false",
    "memberId": "5555",
}
%
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74604942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档