Skip to content

Instantly share code, notes, and snippets.

@Eragoo
Created April 5, 2024 11:52
Show Gist options
  • Save Eragoo/8a6959a22151ad65f86085adca09be2d to your computer and use it in GitHub Desktop.
Save Eragoo/8a6959a22151ad65f86085adca09be2d to your computer and use it in GitHub Desktop.
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;
@Eragoo
Copy link
Author

Eragoo commented Apr 5, 2024

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" }

const expectedOutput =

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 expectedOutput =
    `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 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 expectedOutput =
    `class MyClass {
private final String oldestTransactionDate;
private final String latestTransactionDate;
private final String bankName;
private final Double doubleMeme;
private final Long doubleMemeLong;
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 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 expectedOutput =
    `class MyClass {
private final String oldestTransactionDate;
private final String latestTransactionDate;
private final String bankName;
private final Double doubleMeme;
private final Long doubleMemeLong;
private final List<Long> doubleMemeLongArr;
private final List<Double> doubleMemeLongArrDouble;
private final List<String> strArr;
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 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 expectedOutput =
    `class MyClass {
private final String oldestTransactionDate;
private final String latestTransactionDate;
private final String bankName;
private final Double doubleMeme;
private final Long doubleMemeLong;
private final List<Long> doubleMemeLongArr;
private final List<Double> doubleMemeLongArrDouble;
private final List<String> strArr;
private final List<List<String>> arrOfArr;
private final List<List<List<String>>> arrOfArrOfArr;
private final List<List<List<Double>>> arrOfArrDiffTypes;
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 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" }

const expectedOutput =
    `class MyClass {
private final GodObj godObj;
private final String oldestTransactionDate;
private final String latestTransactionDate;
private final String bankName;
private final Double doubleMeme;
private final Long doubleMemeLong;
private final List<Long> doubleMemeLongArr;
private final List<Double> doubleMemeLongArrDouble;
private final List<String> strArr;
private final List<List<String>> arrOfArr;
private final List<List<List<String>>> arrOfArrOfArr;
private final List<List<List<Double>>> arrOfArrDiffTypes;
private final String id;
private final String source;
private final String accountNumber;

}
class GodObj {
private final String field1;
private final Long field2;
private final Double field3;
}`
const result = generatePojoClass(input);
expect(result.trim()).toBe(expectedOutput.trim());
});

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment