我们的代码中有一个错误,我们不小心从SON中删除了所有越狱字符,导致记录无效.我们的原始版本看起来像这样,其中metadata字段包含字符串化的SON对象.

{
    "id": "123ab",
    "operation": "foo",
    "metadata": "{\"source\": \"ddb\", \"destination\": \"s3\"}",
    "data": "02-02-2024"
}

解析后,metadata字段无效.

{
    "id": "123ab",
    "operation": "foo",
    "metadata": "{"source": "ddb", "destination": "s3"}",
    "data": "02-02-2024"
}

有没有方法可以使用这个无效的SON并手动修复元数据字段?不幸的是,从源头上修复它并不是一个 Select .

推荐答案

我还没有进行过广泛的角 case 测试,但我认为这可以满足您的需要. 基本上,如果我们在双引号字符串中看到一个开花括号,那么我们就会开始对任何引号进行逸出,直到看到闭花括号.

这可能会被病理输入所愚弄,但我不确定是否有一般情况的答案.

import json

s = '{"id": "123ab","operation": "foo","metadata": "{"source": "ddb", "destination": "s3"}","data": "02-02-2024"}'

# So, if we get a curly brace inside a quote, all quote marks need to be escaped
# until we see the matching close brace.


out = ''
brace = 0
quote = 0
for c in s:
    if c == '{' and quote:
        brace += 1
    if c == '"':
        if brace:
            out += '\\'
        quote = 1 - quote
    if c == '}' and quote:
        brace -= 1
    out += c

print(out)

输出:

timr@Tims-NUC:~/src$ python x.py | jq
{
  "id": "123ab",
  "operation": "foo",
  "metadata": "{\"source\": \"ddb\", \"destination\": \"s3\"}",
  "data": "02-02-2024"
}

Python相关问答推荐

决策树分类器的基础sklearn熵和log_loss标准是否有差异?

如何从维基百科的摘要部分/链接列表中抓取链接?

当变量也可以是无或真时,判断是否为假

Django序列化器没有验证或保存数据

如何在vercel中指定Python运行时版本?

inspect_asm不给出输出

将轨迹优化问题描述为NLP.如何用Gekko解决这个问题?当前面临异常:@错误:最大方程长度错误

根据网格和相机参数渲染深度

Odoo 14 hr. emergency.public内的二进制字段

_repr_html_实现自定义__getattr_时未显示

如果值不存在,列表理解返回列表

如何在给定的条件下使numpy数组的计算速度最快?

如何让这个星型模式在Python中只使用一个for循环?

为什么NumPy的向量化计算在将向量存储为类属性时较慢?'

当递归函数的返回值未绑定到变量时,非局部变量不更新:

如何使用SentenceTransformers创建矢量嵌入?

Pandas Data Wrangling/Dataframe Assignment

在极中解析带有数字和SI前缀的字符串

如何在两列上groupBy,并使用pyspark计算每个分组列的平均总价值

跳过嵌套JSON中的级别并转换为Pandas Rame