将一个 JSON 模式映射到另一个 JSON 模式

Map one JSON schema to a different JSON schema

我有一堆 JSON 文件,数千种不同的模式。使用 GenSON (the Python JSON schema generator),我设法为每个输入文件创建了模式文件。现在,我想做的是将所有这些不同的文件标准化为一个定义的模式。这是一个例子:

输入

{
     "name": "Bob Odenkirk",
     "title": "Software Engineer",
     "location": {
         "locality": "San Francisco",
         "region": "CA",
         "country": "United States"
     },
     "age": 62,
     "status": "Active"
}

输出

{
     "names": ["Bob Odenkirk"],
     "occupations": ["Software Engineer"],
     "locations": ["San Francisco, CA"]    
}

本质上,我正在寻找一种与语言无关的方法(即,我不关心使用什么编程语言)来定义如何将输入 JSON 文件解析为输出 JSON 文件。

url https://github.com/bazaarvoice/jolt#jolt 说 Jolt 可能就是您要找的。

Jolt

JSON to JSON transformation library written in Java where the "specification" for the transform is itself a JSON document.

Useful For

Transforming JSON data from ElasticSearch, MongoDb, Cassandra, etc before sending it off to the world

Extracting data from a large JSON documents for your own consumption

我认为将多个 JSON 文件一起解析的最好、最快、最简单的方法是使用 python.
我正在做与您的项目类似的事情,并且 运行 遇到了同样的问题。 我发现这个网站教如何使用 python 实际解析 JSON 文件。原来 python 上有一个名为 json 的库(使用 pip 下载 json 依赖项)可以启用 JSON 文件处理。如果您已经有一个 python 编辑器,此方法比使用 Jolt 更容易和更快 查看此网站以获取更多信息:https://code.tutsplus.com/tutorials/how-to-work-with-json-data-using-python--cms-25758.
您还可以使用 JS,它再次比 Jolt 更快。这是网站:https://docs.microsoft.com/en-us/scripting/javascript/reference/json-parse-function-javascript。这很容易,因为您可以使用 JSON.parse() 函数

我不确定您是否期待以下内容。很久以前我创建了平面对象和输出格式对象。它将return输出填充了数据的格式对象。

var input = {
     "name": "Bob Odenkirk",
     "title": "Software Engineer",
     "location": {
         "locality": "San Francisco",
         "region": "CA",
         "country": "United States"
     },
     "age": 62,
     "status": "Active"
};

var outputFormat = {
    "name": "name",
  "occupations": "title",
  "locations": "location.locality, location.region"
};

var flatInput = {};

function generateFlatInput(input, parent){
     for (var prop in input) {
        if(input.hasOwnProperty(prop) && typeof input[prop] === 'object')
            flatInput = generateFlatInput(input[prop], parent + prop + '.');
        else
         flatInput[parent + prop] =  input[prop];
    }

    return flatInput;
}

function generateOutput(input, outputFormat, delimiter){
     input = generateFlatInput(input, '');

     for (var prop in outputFormat) {
        var fields = outputFormat[prop].split(delimiter);
      var fieldValue = [];
      for(i = 0; i < fields.length; i++){
                    if(!input.hasOwnProperty(fields[i].trim())) continue;

          fieldValue.push(input[fields[i].trim()]);
      }
      outputFormat[prop] = fieldValue.join(delimiter);
   }

   return outputFormat;
}

console.log(generateOutput(input, outputFormat, ', '));

https://jsfiddle.net/u2yyuguk/1/

震动规格

[
  // First build the "city, state" string for location
  {
    "operation": "modify-default-beta",
    "spec": {
      "location": {
        "locConcat": "=concat(@(1,locality),', ',@(1,region))"
      }
    }
  },
  // Then map the fields as needed to positions in an output json
  {
    "operation": "shift",
    "spec": {
      "name": "name[0]",
      "title": "occupations[0]",
      "location": {
        "locConcat": "locations[0]"
      }
    }
  }
]