Все, что вам нужно сделать, это рекурсивный синтаксический анализатор, который будет анализировать json сверху вниз.
вот синтаксический анализатор, чтобы сделать это в javascript, и ту же логику можно перевести на любой другой язык, какхорошо.
const getAttrMap = (attr) => attr ? Object.keys(attr).reduce((acc, curr) => `${acc} ${curr}="${attr[curr]}"`, '') : '';
function parseArr(arr) {
return arr.map(curr => parser(curr)).join('\n');
}
function parser(obj) {
if (typeof obj === 'object') {
if (!obj.children) {
return `<${obj.tag} ${getAttrMap(obj.attrs)}/>`
}
return `<${obj.tag} ${getAttrMap(obj.attrs)}>${
obj.children instanceof Array ? parseArr(obj.children) : parser(obj.children)}</${obj.tag}>`;
}
if (!obj) {
return '';
}
return obj;
}
// usage
parseArr(inputJson);
Пояснение
Если мы знаем, как перевести один блок, мы можем перевести каждый блок рекурсивно.Для анализа одного блока логика проста:
<${obj.tag} ${getAttrMap(obj.attrs)}>CHILD</${obj.tag}>
Это преобразует объект в тег HTML, но что если CHILD сам является другим тегом?просто, мы снова вызываем ту же функцию парсера, однако в этом случае CHILD может быть массивом (несколькими тегами) или единичным, на основе которого мы называем parseArr
или parser
.В тех случаях, когда дочерние элементы не указаны, мы просто возвращаем пустую строку.
Вывод
<figure ><div class="fiwrapper"><img src="/media/images/5cbd41bd7c566057f5e6a875.jpeg"></img></div>
<figcaption ></figcaption></figure>
<p ><br ></br></p>
<figure ><div class="fiwrapper"><img src="/media/images/5cbd45286c7210581c5563ba.jpeg"></img></div>
<figcaption ></figcaption></figure>
<p ><br ></p>
<p >Cool Stuff..</p>``