| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- <!DOCTYPE html>
- <html>
- <head>
- <title>ArduinoJson - JsonBuffer size calculator</title>
- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- </head>
- <body>
- <div class="container">
- <div class="jumbotron">
- <h1>JsonBuffer size calculator</h1>
- </div>
- <div id='error' class="alert alert-danger" role="alert">
- Please paste your JSON in the "input" box
- </div>
- <div class="row">
- <div class="col-md-6">
- <h2>Input</h2>
- <textarea class="form-control" rows=30 id='input'></textarea><br>
- </div>
- <div id='results' class="col-md-6" style='display:none'>
- <h2>Result</h2>
- <h3>Expression</h3>
- <p><code id='resultexpr'></code></p>
- <table class="table">
- <thead>
- <th>Platform</th>
- <th>Size (in bytes)</th>
- </thead>
- <tbody>
- <tr>
- <td>AVR 8-bit</td>
- <td id='sizeavr8'></td>
- </tr>
- <tr>
- <td>ESP8266</td>
- <td id='sizeesp8266'></td>
- </tr>
- <tr>
- <td>x86</td>
- <td id='sizex86'></td>
- </tr>
- <tr>
- <td>x64</td>
- <td id='sizex64'></td>
- </tr>
- </tbody>
- </table>
- </div>
- </div>
- </div>
- </body>
- <script type="text/javascript">
- function Recipe() {
- var arrays = [];
- var objects = [];
- this.addJsonArray = function(size) {
- if (arrays[size])
- arrays[size]++;
- else
- arrays[size] = 1;
- }
- this.addJsonObject = function(size) {
- if (objects[size])
- objects[size]++;
- else
- objects[size] = 1;
- }
- this.getExpression = function() {
- var elements = [];
- for (var size in arrays) {
- var count = arrays[size];
- if (count > 1)
- elements.push(count + "*JSON_ARRAY_SIZE("+size+")");
- else
- elements.push("JSON_ARRAY_SIZE("+size+")");
- }
- for (var size in objects) {
- var count = objects[size];
- if (count > 1)
- elements.push(count + "*JSON_OBJECT_SIZE("+size+")");
- else
- elements.push("JSON_OBJECT_SIZE("+size+")");
- }
- return elements.join(" + ");
- }
- }
- function scanJson(recipe, obj) {
- if (obj instanceof Array) {
- recipe.addJsonArray(obj.length);
- for (var i = 0; i<obj.length; i++)
- scanJson(recipe, obj[i]);
- }
- else if (obj instanceof Object) {
- recipe.addJsonObject(Object.keys(obj).length);
- for (var key in obj)
- scanJson(recipe, obj[key]);
- }
- }
- input.oninput = function(e) {
- results.style.display = 'none';
- error.style.visibility = 'hidden';
- try {
- var recipe = new Recipe();
- scanJson(recipe, JSON.parse(input.value));
- var expression = recipe.getExpression();
- resultexpr.innerText = expression;
- sizeavr8.innerText = eval(
- "function JSON_ARRAY_SIZE(n) { return 4 + 8*n }" +
- "function JSON_OBJECT_SIZE(n) { return 4 + 10*n }" +
- expression
- );
- sizeesp8266.innerText = eval(
- "function JSON_ARRAY_SIZE(n) { return 8 + 12*n }" +
- "function JSON_OBJECT_SIZE(n) { return 8 + 16*n }" +
- expression
- );
- sizex86.innerText = eval(
- "function JSON_ARRAY_SIZE(n) { return 12 + 24*n }" +
- "function JSON_OBJECT_SIZE(n) { return 12 + 32*n }" +
- expression
- );
- sizex64.innerText = eval(
- "function JSON_ARRAY_SIZE(n) { return 24 + 24*n }" +
- "function JSON_OBJECT_SIZE(n) { return 24 + 32*n }" +
- expression
- );
- results.style.display = 'block';
- }
- catch (ex) {
- error.innerText = "ERROR: " + ex.message;
- error.style.visibility = 'visible';
- }
- }
- </script>
- </html>
|