用双反斜杠替换单反斜杠,以便 json 变得可解析

问题描述 投票:0回答:1

我正在使用

cURL
内部的
bash
从远程API获取json数据。还使用
jq
解析并循环 json 数组以执行其他操作。响应如下所示:

[
     {
        "services": [
            "HOM"
        ],
        "specialServiceId": "APPOINTMENT",
        "brandedName": "Appointment Home Delivery®",
        "incompatibleSpecialServices": [
            "DATE",
            "EVENING"
        ],
        "inputParameterRules": [
            {
                "name": "PHONE_NUMBER",
                "brandedName": "Appointment Phone Number",
                "required": true,
                "format":"^\d{10,15}$",
                "description": "A valid 10 to 15 digit phone number including area code and optional extension"
            }
        ]
    },
    {
        "services": [
            "NDA_AM_EH",
            "2DA"
        ],
        "specialServiceId": "NO_SIG",
        "brandedName": "No Signature Required",
        "categoryId": "DEL_CON",
        "incompatibleSpecialServices": [
            "SIG",
            "DIRECT_SIG"
        ],
        "inputParameterRules": [
            {
                "name": "SIGNATURE_RELEASE_NUMBER",
                "description": "A valid signature release number"
            }
        ],
        "specialServiceLevel": "ALLPKG"
    },
  {...},
  {...}
] 

正如您所见,PHONE_NUMBER 的 inputParameterRules 中的

format
字段包含一个反斜杠,这使得该 JSON 无法解析。

我愿意

  1. 在将此 json 存储到文件中之前,将单反斜杠替换为双反斜杠,或者
  2. 删除格式字段。

尝试过这样的事情:

 SPECIAL_SERVICES_RESPONSE=$(curl -s -X GET -H "Authorization: Bearer ${BEARER_TOKEN}" "${SPECIAL_SERVICES_URL}" | jq '[.[].inputParameterRules[] | del(.format)]')

但它没有产生任何结果。

谢谢

json bash curl nested jq
1个回答
0
投票

正如我在评论中提到的,最好的方法是修复 API(或让其提供者修复它),以便它提供格式良好的 JSON。 有充分的理由要求这一点,因为如果一个承诺 JSON 响应的 API 在任何情况下提供无效的 JSON,那么它就是有问题的。

或者,如果您可以控制数据,那么最好的解决方法是将 API 数据库中的正则表达式重新制定为不使用反斜杠 (

\
) 字符的等效正则表达式。 这应该会为您提供不需要客户端更正的 API 响应。

如果这些都不可行,那么最好的长期方法是放弃不合理的 API 提供商,转而选择更好的提供商,但在短期内,有客户端解决方法。

我愿意

  1. 在将此 json 存储到文件中之前,将单反斜杠替换为双反斜杠,或者
  2. 删除格式字段。

尝试过这样的事情:

SPECIAL_SERVICES_RESPONSE=$(curl -s -X GET -H "Authorization: Bearer ${BEARER_TOKEN}" "${SPECIAL_SERVICES_URL}" | jq '[.[].inputParameterRules[] | del(.format)]')

由于要解决的问题是文件不是有效的 JSON,因此理所当然地,您无法通过将文件解析为 JSON 的机制来解决它。

可以使用

sed
进行过滤。 这里的问题是区分需要修复的数据和不需要修复的数据,特别是如果希望 API 提供商能够最终解决他们这边的问题。

以下是您可以考虑的一些替代方案:

  • 这个

    sed
    命令会愚蠢地将输入中的每个反斜杠加倍:

    sed 's/\\/\\\\/g'
    

    这将修复问题中出现的特定错误,但它会破坏文件中其他位置的任何 JSON 正确的反斜杠用法。 如果 API 提供商将他们的东西整合在一起,它将开始破坏他们然后发出的正确 JSON。

  • 这个更有针对性一点。 它会将任何匹配

    /"format":/

    的行中的每个反斜杠加倍
    sed '/"format":/ s/\\/\\\\/g'
    

    目标降低了文件中其他地方以前有效的数据被损坏的可能性,但也避免了修复这些实际上无效的数据。

  • 此命令将在由非反斜杠字符界定的任何奇数个反斜杠的末尾添加一个反斜杠:

    sed -E 's/([^\\](\\\\)*)\\([^\\])/\1\\\\\3/g'
    

    这将修复您当前的错误,并且当 API 提供商修复您的特定问题时不会中断,但它可能会在其他地方破坏 JSON 正确的反斜杠用法。

  • 当然,你可以将后两者结合起来:

    sed -E '/"format":/ s/([^\\](\\\\)*)\\([^\\])/\1\\\\\3/g'
    

    这为您提供了一种目标相当狭窄的方法,当 API 提供商修复问题时,该方法不一定会失败。

这里的首要主题是,如果你不能依赖 API 提供者首先发出正确的数据,那么你能做的最好的事情就是启发式纠正他们发出的任何内容,而这条道路布满了陷阱和陷阱。 您必须首先关注“修复”正确且有效的数据,以及无法识别或修复不正确的数据。

© www.soinside.com 2019 - 2024. All rights reserved.