# Parsing twitter.json

The same query solved three ways: DOM, On-Demand, and kotlinx.serialization.


A classic simdjson benchmark input is `twitter.json`, a Twitter API response
with a top-level `statuses` array. The task below is the same in every tab:
**print the screen name of every user whose `default_profile` is `true`.**

Each API expresses it differently. Compare the three and pick the one that fits
your access pattern.

<div class="kt-codeblock">
  <div class="kt-codeblock__header">
    <div class="kt-codeblock__tabs"><button class="kt-codeblock__tab kt-codeblock__tab--active" data-tab="0" type="button"><svg class="kt-codeblock__file-icon" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" /><path d="M14 2v5a1 1 0 0 0 1 1h5" /><path d="M10 9H8" /><path d="M16 13H8" /><path d="M16 17H8" /></svg>DOM</button><button class="kt-codeblock__tab" data-tab="1" type="button"><svg class="kt-codeblock__file-icon" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" /><path d="M14 2v5a1 1 0 0 0 1 1h5" /><path d="M10 9H8" /><path d="M16 13H8" /><path d="M16 17H8" /></svg>On-Demand</button><button class="kt-codeblock__tab" data-tab="2" type="button"><svg class="kt-codeblock__file-icon" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" /><path d="M14 2v5a1 1 0 0 0 1 1h5" /><path d="M10 9H8" /><path d="M16 13H8" /><path d="M16 17H8" /></svg>Serialization (JVM)</button></div>
    <div class="kt-codeblock__actions">
      <button class="kt-codeblock__action-btn" data-copy type="button"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="14" height="14" x="8" y="8" rx="2" ry="2" /><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2" /></svg><span data-copy-label>copy</span></button>
    </div>
  </div>
  <div class="kt-codeblock__body"><div class="kt-codeblock__panel" data-tab="0">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-kotlin" data-lang="kotlin"><span class="line"><span class="cl"><span class="k">val</span> <span class="py">json</span><span class="p">:</span> <span class="n">ByteArray</span> <span class="p">=</span> <span class="n">loadTwitterJson</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">SimdJsonParser</span><span class="p">().</span><span class="n">use</span> <span class="p">{</span> <span class="n">parser</span> <span class="o">-&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="k">val</span> <span class="py">root</span> <span class="p">=</span> <span class="n">parser</span><span class="p">.</span><span class="n">parse</span><span class="p">(</span><span class="n">json</span><span class="p">)</span> <span class="k">as</span> <span class="n">JsonObject</span>
</span></span><span class="line"><span class="cl">    <span class="k">val</span> <span class="py">statuses</span> <span class="p">=</span> <span class="n">root</span><span class="p">[</span><span class="s2">&#34;statuses&#34;</span><span class="p">]</span> <span class="k">as</span> <span class="n">JsonArray</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="p">(</span><span class="n">tweet</span> <span class="k">in</span> <span class="n">statuses</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">val</span> <span class="py">user</span> <span class="p">=</span> <span class="p">(</span><span class="n">tweet</span> <span class="k">as</span> <span class="n">JsonObject</span><span class="p">)[</span><span class="s2">&#34;user&#34;</span><span class="p">]</span> <span class="k">as</span> <span class="n">JsonObject</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">((</span><span class="n">user</span><span class="p">[</span><span class="s2">&#34;default_profile&#34;</span><span class="p">]</span> <span class="k">as</span> <span class="n">JsonBoolean</span><span class="p">).</span><span class="k">value</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="n">println</span><span class="p">((</span><span class="n">user</span><span class="p">[</span><span class="s2">&#34;screen_name&#34;</span><span class="p">]</span> <span class="k">as</span> <span class="n">JsonString</span><span class="p">).</span><span class="k">value</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
      </div><div class="kt-codeblock__panel" data-tab="1" hidden>
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-kotlin" data-lang="kotlin"><span class="line"><span class="cl"><span class="k">val</span> <span class="py">json</span><span class="p">:</span> <span class="n">ByteArray</span> <span class="p">=</span> <span class="n">loadTwitterJson</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">SimdJsonParser</span><span class="p">().</span><span class="n">use</span> <span class="p">{</span> <span class="n">parser</span> <span class="o">-&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="n">parser</span><span class="p">.</span><span class="n">iterate</span><span class="p">(</span><span class="n">json</span><span class="p">).</span><span class="n">use</span> <span class="p">{</span> <span class="n">doc</span> <span class="o">-&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="p">(</span><span class="n">tweet</span> <span class="k">in</span> <span class="n">doc</span><span class="p">.</span><span class="n">getObject</span><span class="p">()[</span><span class="s2">&#34;statuses&#34;</span><span class="p">].</span><span class="n">getArray</span><span class="p">())</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="k">val</span> <span class="py">user</span> <span class="p">=</span> <span class="n">tweet</span><span class="p">.</span><span class="n">getObject</span><span class="p">()[</span><span class="s2">&#34;user&#34;</span><span class="p">].</span><span class="n">getObject</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="p">(</span><span class="n">user</span><span class="p">[</span><span class="s2">&#34;default_profile&#34;</span><span class="p">].</span><span class="n">getBoolean</span><span class="p">())</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="n">println</span><span class="p">(</span><span class="n">user</span><span class="p">[</span><span class="s2">&#34;screen_name&#34;</span><span class="p">].</span><span class="n">getString</span><span class="p">())</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
      </div><div class="kt-codeblock__panel" data-tab="2" hidden>
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-kotlin" data-lang="kotlin"><span class="line"><span class="cl"><span class="nd">@Serializable</span>
</span></span><span class="line"><span class="cl"><span class="k">data</span> <span class="k">class</span> <span class="nc">Twitter</span><span class="p">(</span><span class="k">val</span> <span class="py">statuses</span><span class="p">:</span> <span class="n">List</span><span class="p">&lt;</span><span class="n">Status</span><span class="p">&gt;)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@Serializable</span>
</span></span><span class="line"><span class="cl"><span class="k">data</span> <span class="k">class</span> <span class="nc">Status</span><span class="p">(</span><span class="k">val</span> <span class="py">user</span><span class="p">:</span> <span class="n">User</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@Serializable</span>
</span></span><span class="line"><span class="cl"><span class="k">data</span> <span class="k">class</span> <span class="nc">User</span><span class="p">(</span><span class="k">val</span> <span class="py">default</span><span class="n">_profile</span><span class="p">:</span> <span class="n">Boolean</span><span class="p">,</span> <span class="k">val</span> <span class="py">screen</span><span class="n">_name</span><span class="p">:</span> <span class="n">String</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">val</span> <span class="py">json</span><span class="p">:</span> <span class="n">String</span> <span class="p">=</span> <span class="n">loadTwitterJson</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">val</span> <span class="py">simdJson</span> <span class="p">=</span> <span class="n">SimdJson</span> <span class="p">{</span> <span class="n">ignoreUnknownKeys</span> <span class="p">=</span> <span class="k">true</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="p">(</span><span class="n">status</span> <span class="k">in</span> <span class="n">simdJson</span><span class="p">.</span><span class="n">decodeFromString</span><span class="p">&lt;</span><span class="n">Twitter</span><span class="p">&gt;(</span><span class="n">json</span><span class="p">).</span><span class="n">statuses</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">status</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">default_profile</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">println</span><span class="p">(</span><span class="n">status</span><span class="p">.</span><span class="n">user</span><span class="p">.</span><span class="n">screen_name</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
      </div></div>
</div>


New to these APIs? Start with the [DOM](../../guides/dom/),
[On-Demand](../../guides/on-demand/), and
[serialization](../../guides/serialization/) guides.
