【问题标题】:Remap invalid property names in JSON Schema重新映射 JSON Schema 中的无效属性名称
【发布时间】:2020-10-26 09:47:25
【问题描述】:

我有大量的外部 JSON 模式和 JSON 文档,我需要将它们作为 CSharp 项目的一部分进行解析 它们来自一家外部公司,它们似乎是 JSON 和其他东西的混合体。 我能够很好地解析 JSON,但我需要 Schemas 才能理解它们。

问题来自被定义为“元数据”的“类型”以及被重新映射为“数据类型”的实际类型名称

{
    "type": "MetaData",
    "name": "atypeoffield",
    "title": "ancillary data for field type",
    "object_ID": "MetaData-atypeoffield",
    "parent_object_ID": "fieldreceiver",
    "dataType": "object",
    "properties": {
        "fieldreceivercontrol": {
            "description": "ancillary data for control",
            "type": "array",
            "minItems": 1,
            "maxItems": 144,

除了在输入的过程中进行字符串替换之外,您还可以为 Newtonsoft JSON 想出更优雅的方法来解决这个问题吗?

我希望动态加载架构,然后将它们用于针对 Web 服务的临时字段验证,但主要要求是在运行时动态加载一组架构以确定要验证的字段

【问题讨论】:

  • 模式是否有效jsonschema 模式? Newtonsoft 有一个单独的包Json.NET Schema 用于解析和验证jsonschema
  • ... 看起来不像。 jsonschema 使用 "type" 关键字来指示值类型。您的架构似乎正在使用"dataType"。您是否有一些说明架构标准的文档?你能把它重新映射到jsonschema吗?
  • 我写了一个正则表达式来重新映射无效的关键字 - 丑陋的软糖,但它必须这样做!

标签: c# json.net


【解决方案1】:

我最终使用字符串替换和正则表达式替换来清理 JSON 和关联的架构,因此我能够得到一个干净的读取。

        if (matchedJson.Contains("type\":")) matchedJson = matchedJson.Replace("type\":", "metadata_type\":");
        if (matchedJson.Contains("dataType\":")) matchedJson = matchedJson.Replace("dataType\":", "type\":");
        if (matchedJson.Contains("\\\"")) matchedJson = matchedJson.Replace("\\\"", "\"");
        string containsPattern = @"(""config"": ""{)(.*)(""\n})";
        string replacement = "$2";
        string cleanJson = Regex.Replace(matchedJson, containsPattern, replacement,
                  RegexOptions.IgnoreCase,
                  TimeSpan.FromSeconds(0.5));

这当然不优雅,但让我可以移动表盘,并删除导致架构验证失败的元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 2016-03-17
    • 1970-01-01
    • 2015-11-09
    • 2018-03-29
    • 2020-06-18
    相关资源
    最近更新 更多