我有一些sudo-json /随机字符串从一个端点返回,其中缺少双引号,一些逗号在例如, ,之间没有任何逗号,还有一些字段没有值。示例:
{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。我试过这样的方法:
sed 's/\b\([\w:.-]*\)\b/"\1"/g'但这似乎什么都没做。如果我错过了什么,我会很感激的!
发布于 2022-11-29 01:36:57
我对JSON没有任何经验,但作为一项调整格式以适应JSON的练习,我已经将以下不处理嵌套大括号的逻辑组合在一起(我将为将来研究这一点)。但是对于您提供的单行,这是非常错误的,我已经提出了下面的“转换器”脚本,如果这是由您正在使用的一些固定实用程序生成的格式。
最后一行的逗号不应该出现,因为它是“数组”中的最后一个元素。这是唯一不符合JSON标准的项。
我还认为,您的尾随"%“是无关的,但是我已经将它与此代码放在一起了。这是很容易重新加工的。
因此,下面是值得学习的代码:
#!/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 ) ;
                } ;
            } ;
        } ;
    } ;
}'产出如下:
{
    "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",
}
%https://stackoverflow.com/questions/74604942
复制相似问题