Поиск по этому блогу

четверг, 25 августа 2016 г.

Как преобразовать html2json & json2html

Весь современный фронтенд "настроен" на работу с данными в формате Json. Если я захочу "стырить" данные с чужого сайта, том можно не ваять парсер, а вырезать кусок кода, преобразовать его в json, и использовать свойства объекта javascript, например, в шаблонизаторе... Не уверен, что такой комплесный парсер лучше... Но идея красивая. Потому наскоро нашел с пяток вариантов, вот примеры Pure JavaScript HTML5 Parser, gulp-to-json, Demo online

Map HTML to JSON
Working example: jsfiddle.net (Tested in chrome, I can't guarantee full browser support - you will have to test this)


html2json & json2html
Pure JavaScript HTML5 Parser
Demo online Pure JavaScript HTML5 Parser
html-to-json
gulp-html2jsobject
gulp-to-json

Okay, I should probably give an example. What I'm trying to do is the following. Parse a string of html:

In [ ]:
<div>
  <span>text</span>Text2
</div>

##into a json object like so:
{
  "type" : "div",
  "content" : [
    {
      "type" : "span",
      "content" : [
        "Text2"
      ]
    },
    "Text2"
  ]
}

I just wrote this function that does what you want, try it out let me know if it doesn't work correctly for you:

In [ ]:
// Test with an element.
var initElement = document.getElementsByTagName("html")[0];
var json = mapDOM(initElement, true);
console.log(json);

// Test with a string.
initElement = "<div><span>text</span>Text2</div>";
json = mapDOM(initElement, true);
console.log(json);

function mapDOM(element, json) {
    var treeObject = {};

    // If string convert to document Node
    if (typeof element === "string") {
        if (window.DOMParser) {
              parser = new DOMParser();
              docNode = parser.parseFromString(element,"text/xml");
        } else { // Microsoft strikes again
              docNode = new ActiveXObject("Microsoft.XMLDOM");
              docNode.async = false;
              docNode.loadXML(element); 
        } 
        element = docNode.firstChild;
    }

    //Recursively loop through DOM elements and assign properties to object
    function treeHTML(element, object) {
        object["type"] = element.nodeName;
        var nodeList = element.childNodes;
        if (nodeList != null) {
            if (nodeList.length) {
                object["content"] = [];
                for (var i = 0; i < nodeList.length; i++) {
                    if (nodeList[i].nodeType == 3) {
                        object["content"].push(nodeList[i].nodeValue);
                    } else {
                        object["content"].push({});
                        treeHTML(nodeList[i], object["content"][object["content"].length -1]);
                    }
                }
            }
        }
        if (element.attributes != null) {
            if (element.attributes.length) {
                object["attributes"] = {};
                for (var i = 0; i < element.attributes.length; i++) {
                    object["attributes"][element.attributes[i].nodeName] = element.attributes[i].nodeValue;
                }
            }
        }
    }
    treeHTML(element, treeObject);

    return (json) ? JSON.stringify(treeObject) : treeObject;
}

browser

In [ ]:
<script src="https://cdn.rawgit.com/blowsie/Pure-JavaScript-HTML5-Parser/master/htmlparser.js"></script>
<script src="src/html2json.js"></script>

Nodejs

In [ ]:
$ npm install html2json
In [ ]:
var html2json = require('html2json').html2json;
var json2html = require('html2json').json2html;

Пример

In [ ]:
<div id="1" class="foo">
<h2>sample text with <code>inline tag</code></h2>
<pre id="demo" class="foo bar">foo</pre>
<pre id="output" class="goo">goo</pre>
<input id="execute" type="button" value="execute"/>
</div>
In [ ]:
{
  node: 'root',
  child: [
    {
      node: 'element',
      tag: 'div',
      attr: { id: '1', class: 'foo' },
      child: [
        {
          node: 'element',
          tag: 'h2',
          child: [
            { node: 'text', text: 'sample text with ' },
            { node: 'element', tag: 'code', child: [{ node: 'text', text: 'inline tag' }] }
          ]
        },
        {
          node: 'element',
          tag: 'pre',
          attr: { id: 'demo', class: ['foo', 'bar'] },
          child: [{ node: 'text', text: 'foo' }]
        },
        {
          node: 'element',
          tag: 'pre',
          attr: { id: 'output', class: 'goo' },
          child: [{ node: 'text', text: 'goo' }]
        },
        {
          node: 'element',
          tag: 'input',
          attr: { id: 'execute', type: 'button', value: 'execute' }
        }
      ]
    }
  ]
}


Посты чуть ниже также могут вас заинтересовать

Комментариев нет: