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"
}
]
}
我有以下 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"
}
]
}