Created
April 5, 2024 11:52
-
-
Save Eragoo/8a6959a22151ad65f86085adca09be2d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function generatePojoClass(json) { | |
return parseObj(json, "MyClass"); | |
} | |
function getJavaType(jsonType, key, value) { | |
switch (jsonType) { | |
case 'String': | |
return 'String'; | |
case 'Long': | |
return 'Long'; | |
case 'Double': | |
return 'Double'; | |
case 'Boolean': | |
return 'Boolean'; | |
case 'Object': | |
return toClazzName(key); | |
case 'Array': | |
if (value.length === 0) { | |
return 'List<Object>'; | |
} else { | |
let arrayJsonTypes = new Set(value.map(v => getJsonType(v))); | |
let arrayJavaType = arrayJsonTypes.has("Array") ? getJavaType("Array", key, value[0]) : | |
arrayJsonTypes.has("Object") ? "Object" : | |
arrayJsonTypes.has("String") ? "String" : | |
arrayJsonTypes.has("Double") ? "Double" : | |
arrayJsonTypes.has("Long") ? "Long" : | |
"Boolean"; | |
return `List<${arrayJavaType}>`; | |
} | |
} | |
} | |
function parseObj(json, className) { | |
let parsed = JSON.parse(json); | |
//todo try to fix arrays in json like map them to same type | |
let keys = Object.keys(parsed); | |
let classBody = ""; | |
let additionalClasses = ""; | |
keys.forEach((key) => { | |
let value = parsed[key]; | |
let jsonType = getJsonType(value); | |
let javaType = getJavaType(jsonType, key, value); | |
if (jsonType === 'Object') { | |
let innerClass = parseObj(JSON.stringify(value), javaType); | |
additionalClasses += innerClass; | |
} | |
classBody += ` private final ${javaType} ${camelCase(key)};\n`; | |
}); | |
let mainClass = `class ${className} {\n${classBody}}`; | |
return mainClass + "\n" + additionalClasses; | |
} | |
function getJsonType(value) { | |
if (typeof value === 'string') { | |
return 'String'; | |
} else if (Array.isArray(value)) { | |
return 'Array'; | |
} else if (typeof value === 'number') { | |
if (Number.isInteger(value)) { | |
return 'Long'; | |
} else { | |
return 'Double'; | |
} | |
} else if (typeof value === 'boolean') { | |
return 'Boolean'; | |
} else if (typeof value === 'object') { | |
return 'Object'; | |
} | |
} | |
function toClazzName(str) { | |
let key = camelCase(str) | |
return key.charAt(0).toUpperCase() + key.slice(1); | |
} | |
function camelCase(str) { | |
str = str.replace("-", " ") | |
str = str.replace("_", " ") | |
return str | |
.replace(/\s(.)/g, function (a) { | |
return a.toUpperCase(); | |
}) | |
.replace(/\s/g, '') | |
.replace(/^(.)/, function (b) { | |
return b.toLowerCase(); | |
}); | |
} | |
export default generatePojoClass; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
import generatePojoClass from "./PojoGenerator";
test('flat json', () => {
let input =
{ "oldestTransactionDate": "2022-08-01", "latestTransactionDate": "2023-06-30", "bankName": "CAPITAL ONE BANK", "id": "a047eb08-a564-3b10-96d6-1cc90ef91103", "source": "Bank Statement", "accountNumber": "2082743025" }
class MyClass { private final String oldestTransactionDate; private final String latestTransactionDate; private final String bankName; private final String id; private final String source; private final String accountNumber; }
const result = generatePojoClass(input);
expect(result.trim()).toBe(expectedOutput.trim());
});
test('flat json camel case chekc', () => {
let input =
{ "oldest_TransactionDate": "2022-08-01", "latestTransactionDate": "2023-06-30", "bank-Name": "CAPITAL ONE BANK", "id": "a047eb08-a564-3b10-96d6-1cc90ef91103", "source": "Bank Statement", "account-Number": "2082743025" }
}`
const result = generatePojoClass(input);
expect(result.trim()).toBe(expectedOutput.trim());
});
test('flat json with double and long', () => {
let input =
{ "oldestTransactionDate": "2022-08-01", "latestTransactionDate": "2023-06-30", "bankName": "CAPITAL ONE BANK", "doubleMeme": 1.1, "doubleMemeLong": 1, "id": "a047eb08-a564-3b10-96d6-1cc90ef91103", "source": "Bank Statement", "accountNumber": "2082743025" }
}`
const result = generatePojoClass(input);
expect(result.trim()).toBe(expectedOutput.trim());
});
test('flat json with arrays', () => {
let input =
{ "oldestTransactionDate": "2022-08-01", "latestTransactionDate": "2023-06-30", "bankName": "CAPITAL ONE BANK", "doubleMeme": 1.1, "doubleMemeLong": 1, "doubleMemeLongArr": [1,2,3], "doubleMemeLongArrDouble": [1.1,2.2,3.0], "strArr": ["1.1","2.2","3.0", "false"], "id": "a047eb08-a564-3b10-96d6-1cc90ef91103", "source": "Bank Statement", "accountNumber": "2082743025" }
}`
const result = generatePojoClass(input);
expect(result.trim()).toBe(expectedOutput.trim());
});
test('flat json with array of arrays', () => {
let input =
{ "oldestTransactionDate": "2022-08-01", "latestTransactionDate": "2023-06-30", "bankName": "CAPITAL ONE BANK", "doubleMeme": 1.1, "doubleMemeLong": 1, "doubleMemeLongArr": [1,2,3], "doubleMemeLongArrDouble": [1.1,2.2,3.0], "strArr": ["1.1","2.2","3.0", "false"], "arrOfArr": [["1.1"],["2.2","3.0"], ["false"]], "arrOfArrOfArr": [[["1.1"]],[["2.2"],["3.0"]], [["false"]]], "arrOfArrDiffTypes": [[[1.1]],[["2.2"],["3.0"]], [["false"]]], "id": "a047eb08-a564-3b10-96d6-1cc90ef91103", "source": "Bank Statement", "accountNumber": "2082743025" }
}`
const result = generatePojoClass(input);
expect(result.trim()).toBe(expectedOutput.trim());
});
test('flat json with simple object', () => {
let input =
{ "godObj": { "field1": "1", "field2": 2, "field3": 2.2 }, "oldestTransactionDate": "2022-08-01", "latestTransactionDate": "2023-06-30", "bankName": "CAPITAL ONE BANK", "doubleMeme": 1.1, "doubleMemeLong": 1, "doubleMemeLongArr": [1,2,3], "doubleMemeLongArrDouble": [1.1,2.2,3.0], "strArr": ["1.1","2.2","3.0", "false"], "arrOfArr": [["1.1"],["2.2","3.0"], ["false"]], "arrOfArrOfArr": [[["1.1"]],[["2.2"],["3.0"]], [["false"]]], "arrOfArrDiffTypes": [[[1.1]],[["2.2"],["3.0"]], [["false"]]], "id": "a047eb08-a564-3b10-96d6-1cc90ef91103", "source": "Bank Statement", "accountNumber": "2082743025" }
}
class GodObj {
private final String field1;
private final Long field2;
private final Double field3;
}`
const result = generatePojoClass(input);
expect(result.trim()).toBe(expectedOutput.trim());
});