guostong 2023-10-20 22:20 采纳率: 0%
浏览 3

python - 如何合并 schema reference in json schema

如何合并 schema reference in json schema?
原schema 如下:

{
  "difinitions": {
    "defA": {
          "productId": 1,
          "productName": "A green door",
          "price": 12.50,
          "tags": [ "home", "green" ]
    }
  },
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "colA": {
        "$ref": "#/definitions/defA"
      }
    }
  }
}

合并后如下, 就是把 definition 填到引用的地方:

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "colA": {
        "productId": 1,
        "productName": "A green door",
        "price": 12.50,
        "tags": [ "home", "green" ]
      }
    }
  }
}

谢谢!

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-21 08:41
    关注

    【以下回答由 GPT 生成】

    问题的解决方案如下:

    步骤 1: 导入必要的库

    我们需要导入Python中的json库和copy库,用于处理JSON数据和进行深拷贝。

    import json
    import copy
    

    步骤 2: 读取原始的JSON Schema

    首先,我们需要读取原始的JSON Schema,并将其解析为Python对象。

    # 原始 JSON Schema
    original_schema = """
    {
      "definitions": {
        "defA": {
          "productId": 1,
          "productName": "A green door",
          "price": 12.50,
          "tags": [ "home", "green" ]
        }
      },
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "colA": {
            "$ref": "#/definitions/defA"
          }
        }
      }
    }
    """
    
    # 解析 JSON Schema 为 Python对象
    schema = json.loads(original_schema)
    

    步骤 3: 合并引用

    接下来,我们需要编写一个递归函数来合并引用。

    def resolve_ref(schema, definitions):
        # 如果 "schema" 是一个引用,则获取引用的名称
        if isinstance(schema, dict) and "$ref" in schema:
            ref = schema["$ref"]
            # 获取引用的定义
            ref_definition = definitions.get(ref.strip("#/"))
    
            # 递归合并引用
            if ref_definition is not None:
                merged_schema = copy.deepcopy(ref_definition)
                return resolve_ref(merged_schema, definitions)
    
        # 如果 "schema" 是一个字典,则遍历其所有键值对
        if isinstance(schema, dict):
            for key, value in schema.items():
                schema[key] = resolve_ref(value, definitions)
    
        # 如果 "schema" 是一个列表,则遍历列表中的每个元素
        elif isinstance(schema, list):
            for i, item in enumerate(schema):
                schema[i] = resolve_ref(item, definitions)
    
        return schema
    

    步骤 4: 执行合并

    最后,我们使用 resolve_ref 函数来执行合并,并将结果转换回JSON字符串格式。

    # 执行合并
    merged_schema = resolve_ref(schema, schema.get("definitions", {}))
    
    # 转换为 JSON 字符串
    merged_json = json.dumps(merged_schema, indent=2)
    

    步骤 5: 输出结果

    你可以将结果打印出来,或按照需要保存到文件中。

    print(merged_json)
    

    完整的代码示例如下:

    import json
    import copy
    
    def resolve_ref(schema, definitions):
        if isinstance(schema, dict) and "$ref" in schema:
            ref = schema["$ref"]
            ref_definition = definitions.get(ref.strip("#/"))
    
            if ref_definition is not None:
                merged_schema = copy.deepcopy(ref_definition)
                return resolve_ref(merged_schema, definitions)
    
        if isinstance(schema, dict):
            for key, value in schema.items():
                schema[key] = resolve_ref(value, definitions)
        elif isinstance(schema, list):
            for i, item in enumerate(schema):
                schema[i] = resolve_ref(item, definitions)
    
        return schema
    
    original_schema = """
    {
      "definitions": {
        "defA": {
          "productId": 1,
          "productName": "A green door",
          "price": 12.50,
          "tags": [ "home", "green" ]
        }
      },
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "colA": {
            "$ref": "#/definitions/defA"
          }
        }
      }
    }
    """
    
    schema = json.loads(original_schema)
    merged_schema = resolve_ref(schema, schema.get("definitions", {}))
    merged_json = json.dumps(merged_schema, indent=2)
    
    print(merged_json)
    

    运行以上代码,你将得到所需的合并后的JSON Schema。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 10月20日

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看