Jolt Transformation - 小写所有键?

Jolt Transformation - Lowercase all keys?

我有以下 JSON:-

{
  "ROWNUM": "328938",
  "SOURCE_NAME": "I2323",
  "ID": "333333",
  "FIRST_NAME": "A121221",
  "KNOWN_AS": "G1223321",
  "LAST_NAME": "sadsadsd",
  "PLACE_OF_BIRTH": "Indsadsadsaddsaia",
  "DATE_OF_BIRTH": "sadsaddsa",
  "UPRN": "sadsadsad",
  "POST_CODE": "asdsadsda",
  "POST_TOWN": "GLASGOW",
  "ESTIMATED_DOB": "N",
  "LAST_UPDATED": "2019-02-11T13:57:05.264Z",
  "cluster_id": 3020,
  "aliases": [
    {
      "_id": {
        "timestamp": 1550152767,
        "machineIdentifier": 6505561,
        "processIdentifier": 59,
        "counter": 2775622,
        "time": 1550152767000,
        "timeSecond": 1550152767,
        "date": 1550152767000
      },
      "ROWNUM": "328938",
      "SOURCE_NAME": "I2323",
      "ID": "333333",
      "FIRST_NAME": "A121221",
      "KNOWN_AS": "G1223321",
      "LAST_NAME": "sadsadsd",
      "PLACE_OF_BIRTH": "Indsadsadsaddsaia",
      "DATE_OF_BIRTH": "sadsaddsa",
      "UPRN": "sadsadsad",
      "POST_CODE": "asdsadsda",
      "POST_TOWN": "GLASGOW",
      "ESTIMATED_DOB": "N",
      "LAST_UPDATED": "2019-02-11T13:57:05.264Z",
      "cluster_id": 3020,
      "score": "0.9997580647468567"
    },
    {
      "_id": {
        "timestamp": 1550152767,
        "machineIdentifier": 6505561,
        "processIdentifier": 59,
        "counter": 2775622,
        "time": 1550152767000,
        "timeSecond": 1550152767,
        "date": 1550152767000
      },
      "ROWNUM": "328938",
      "SOURCE_NAME": "I2323",
      "ID": "333333",
      "FIRST_NAME": "A121221",
      "KNOWN_AS": "G1223321",
      "LAST_NAME": "sadsadsd",
      "PLACE_OF_BIRTH": "Whatever",
      "DATE_OF_BIRTH": "sadsaddsa",
      "UPRN": "sadsadsad",
      "POST_CODE": "asdsadsda",
      "POST_TOWN": "PAISLEY",
      "ESTIMATED_DOB": "N",
      "LAST_UPDATED": "2019-02-11T13:57:05.264Z",
      "cluster_id": 3020,
      "score": "0.9997580647468567"
    }
  ]
}

是否有将每个键(包括嵌套对象中的键)小写的 jolt 规范? (在这种情况下,aliases 下是什么)。

以下适用于顶级键但不适用于嵌套键:

[
  {
    // unwrap the keys and values into literal
    // "key" : "A", "value" : "b"
    "operation": "shift",
    "spec": {
      "*": {
        "$": "&1.key",
        "@": "&1.value"
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "*": {
        // Now that the origional key
        //  is on the "right hand side"
        //  lowercase it
        "key": "=toLower"
      }
    }
  },
  {
    // pivot back, the now lowercased keys
    "operation": "shift",
    "spec": {
      "*": {
        "value": "@(1,key)"
      }
    }
  }
]

谢谢!

您可以实现自定义 JsonParserDelegate 解析器,如以下测试所示。

可以从https://github.com/hovanessyan/json_lowercase_all_keys.git

签出一个工作项目

a) 创建您自己的小写键的解析器 (KeysToLowercaseParser)

b) 覆盖 JsonFactory 并使用新的解析器

我已将您的json内容粘贴到test.json中,在本次测试中阅读。

public class LowerCaseJsonTest {

    @Test
    public void name() throws IOException {

        ObjectMapper mapper = new ObjectMapper(new JsonFactory() {
            @Override
            protected JsonParser _createParser(byte[] data, int offset, int len, IOContext ctxt) throws IOException {
                return new KeysToLowercaseParser(super._createParser(data, offset, len, ctxt));
            }

            @Override
            protected JsonParser _createParser(InputStream in, IOContext ctxt) throws IOException {
                return new KeysToLowercaseParser(super._createParser(in, ctxt));
            }

            @Override
            protected JsonParser _createParser(Reader r, IOContext ctxt) throws IOException {
                return new KeysToLowercaseParser(super._createParser(r, ctxt));
            }

            @Override
            protected JsonParser _createParser(char[] data, int offset, int len, IOContext ctxt, boolean recyclable)
                    throws IOException {
                return new KeysToLowercaseParser(super._createParser(data, offset, len, ctxt, recyclable));
            }
        });


        File file = new File("src/main/resources/test.json");
        JsonNode jsonNode = mapper.readTree(file);
        String output = mapper.writeValueAsString(jsonNode);
        System.out.println(output);
    }

}

class KeysToLowercaseParser extends JsonParserDelegate {
    KeysToLowercaseParser(JsonParser d) {
        super(d);
    }

    @Override
    public String getCurrentName() throws IOException {
        if (hasTokenId(JsonTokenId.ID_FIELD_NAME)) {
            return delegate.getCurrentName().toLowerCase();
        }
        return delegate.getCurrentName();
    }

    @Override
    public String getText() throws IOException {
        if (hasTokenId(JsonTokenId.ID_FIELD_NAME)) {
            return delegate.getText().toLowerCase();
        }
        return delegate.getText();
    }
}

这会产生扩展现有转换的预期结果:

[
  {
    // unwrap the keys and values into literal
    // "key" : "A", "value" : "b"
    "operation": "shift",
    "spec": {
      "*": {
        "$": "&1.key",
        "@": "&1.value"
      },
      //do the same for everything in aliases
      //&3 = aliases
      //&2 = array position
      //&1 = position of kvp
      "aliases": {
        "*": {
          "*": {
            "$": "&3.&2.&1.key",
            "@": "&3.&2.&1.value"
          }
        }
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "*": {
        // Now that the origional key
        //  is on the "right hand side"
        //  lowercase it
        "key": "=toLower"
      },
      "aliases": {
        "*": {
          "*": {
            // Now that the origional key
            //  is on the "right hand side"
            //  lowercase it
            "key": "=toLower"
          }
        }
      }
    }
  },
  {
    // pivot back, the now lowercased keys
    "operation": "shift",
    "spec": {
      "*": {
        "value": "@(1,key)"
      },
      "aliases": {
        "*": {
          "*": {
            //&3 = aliases
            //&2 = array postion
            //@(1,key) values from "key"
            "value": "&3.[&2].@(1,key)"
          }
        }
      }
    }
  }
]

生成以下内容:

{
  "rownum": "328938",
  "source_name": "I2323",
  "id": "333333",
  "first_name": "A121221",
  "known_as": "G1223321",
  "last_name": "sadsadsd",
  "place_of_birth": "Indsadsadsaddsaia",
  "date_of_birth": "sadsaddsa",
  "uprn": "sadsadsad",
  "post_code": "asdsadsda",
  "post_town": "GLASGOW",
  "estimated_dob": "N",
  "last_updated": "2019-02-11T13:57:05.264Z",
  "cluster_id": 3020,
  "aliases": [
    {
      "_id": {
        "timestamp": 1550152767,
        "machineIdentifier": 6505561,
        "processIdentifier": 59,
        "counter": 2775622,
        "time": 1550152767000,
        "timeSecond": 1550152767,
        "date": 1550152767000
      },
      "rownum": "328938",
      "source_name": "I2323",
      "id": "333333",
      "first_name": "A121221",
      "known_as": "G1223321",
      "last_name": "sadsadsd",
      "place_of_birth": "Indsadsadsaddsaia",
      "date_of_birth": "sadsaddsa",
      "uprn": "sadsadsad",
      "post_code": "asdsadsda",
      "post_town": "GLASGOW",
      "estimated_dob": "N",
      "last_updated": "2019-02-11T13:57:05.264Z",
      "cluster_id": 3020,
      "score": "0.9997580647468567"
    },
    {
      "_id": {
        "timestamp": 1550152767,
        "machineIdentifier": 6505561,
        "processIdentifier": 59,
        "counter": 2775622,
        "time": 1550152767000,
        "timeSecond": 1550152767,
        "date": 1550152767000
      },
      "rownum": "328938",
      "source_name": "I2323",
      "id": "333333",
      "first_name": "A121221",
      "known_as": "G1223321",
      "last_name": "sadsadsd",
      "place_of_birth": "Whatever",
      "date_of_birth": "sadsaddsa",
      "uprn": "sadsadsad",
      "post_code": "asdsadsda",
      "post_town": "PAISLEY",
      "estimated_dob": "N",
      "last_updated": "2019-02-11T13:57:05.264Z",
      "cluster_id": 3020,
      "score": "0.9997580647468567"
    }
  ]
}