I am currently having problem on modifying a Json schema, the schema is below:
{
"$schema": "www.abc.com",
"compounds": {
"schemas": {
"Run": {
"type": "object",
"properties": {
"runContext": {
"type": "object",
"properties": {
"runNumber": {
"type": "integer"
},
"conveyanceType": {
"type": "string"
}
},
"required": [
"runNumber",
"conveyanceType"
]
}
}
}
}
}
}
I know this can be done using recursion, and I have tried to fetch the required item(code is below), but I have no idea how to put the required item back into properties and change to boolean value. Thanks in advance.
private modifyJson(jsonArr: any) {
//console.log(jsonArr);
for (let i in jsonArr) {
//console.log(typeof i);
let item = jsonArr[i];
if (typeof item === "object") {
//console.log("here " + JSON.stringify(item));
this.modifyJson(item);
if (i === "required") {
console.log("here required " + JSON.stringify(item));
for (let j in item) {
//console.log(item[j]);
const required = item[j]; //fetch required item
}
}
}
}
}
I want to put it into such format:
{
"$schema": "www.abc.com",
"compounds": {
"schemas": {
"Run": {
"type": "object",
"properties": {
"runContext": {
"type": "object",
"properties": {
"runNumber": {
"type": "integer",
"required": true
},
"conveyanceType": {
"type": "string",
"required": true
}
}
}
}
}
}
}
}
Advertisement
Answer
You can use recursive function with for...in loop and update object with required key on any level.
const data = {"$schema":"www.abc.com","compounds":{"schemas":{"Run":{"type":"object","properties":{"runContext":{"type":"object","properties":{"runNumber":{"type":"integer"},"conveyanceType":{"type":"string"}},"required":["runNumber","conveyanceType"]}}}}}}
function update(obj) {
for (let prop in obj) {
if (typeof obj[prop] === 'object') update(obj[prop]);
if (prop === 'required') {
obj[prop].forEach(key => {
if (obj.properties[key]) {
obj.properties[key].required = true;
}
})
delete obj[prop]
}
}
}
update(data)
console.log(data)