UPdate.
This commit is contained in:
@@ -0,0 +1,166 @@
|
||||
{# retoor <retoor@molodetz.nl> #}
|
||||
{% extends 'page.html' %}
|
||||
|
||||
{% set page_title = "json" %}
|
||||
{% set breadcrumb = [{"url": "api/index.html", "title": "API Reference"}, {"title": "json"}] %}
|
||||
{% set prev_page = {"url": "api/dns.html", "title": "dns"} %}
|
||||
{% set next_page = {"url": "api/base64.html", "title": "base64"} %}
|
||||
|
||||
{% block article %}
|
||||
<h1>json</h1>
|
||||
|
||||
<p>The <code>json</code> module provides JSON parsing and stringification. It uses the cJSON library for parsing and implements stringify in Wren.</p>
|
||||
|
||||
<pre><code>import "json" for Json</code></pre>
|
||||
|
||||
<h2>Json Class</h2>
|
||||
|
||||
<div class="class-header">
|
||||
<h3>Json</h3>
|
||||
<p>JSON parsing and stringification</p>
|
||||
</div>
|
||||
|
||||
<h3>Static Methods</h3>
|
||||
|
||||
<div class="method-signature">
|
||||
<span class="method-name">Json.parse</span>(<span class="param">string</span>) → <span class="type">Map|List|String|Num|Bool|null</span>
|
||||
</div>
|
||||
<p>Parses a JSON string and returns the corresponding Wren value.</p>
|
||||
<ul class="param-list">
|
||||
<li><span class="param-name">string</span> <span class="param-type">(String)</span> - JSON string to parse</li>
|
||||
<li><span class="returns">Returns:</span> Parsed value (Map, List, String, Num, Bool, or null)</li>
|
||||
</ul>
|
||||
<pre><code>var data = Json.parse('{"name": "Alice", "age": 30}')
|
||||
System.print(data["name"]) // Alice
|
||||
System.print(data["age"]) // 30
|
||||
|
||||
var list = Json.parse('[1, 2, 3]')
|
||||
System.print(list[0]) // 1</code></pre>
|
||||
|
||||
<div class="method-signature">
|
||||
<span class="method-name">Json.stringify</span>(<span class="param">value</span>) → <span class="type">String</span>
|
||||
</div>
|
||||
<p>Converts a Wren value to a JSON string (compact, no whitespace).</p>
|
||||
<ul class="param-list">
|
||||
<li><span class="param-name">value</span> <span class="param-type">(any)</span> - Value to stringify</li>
|
||||
<li><span class="returns">Returns:</span> JSON string</li>
|
||||
</ul>
|
||||
<pre><code>var json = Json.stringify({"name": "Alice", "age": 30})
|
||||
System.print(json) // {"name":"Alice","age":30}</code></pre>
|
||||
|
||||
<div class="method-signature">
|
||||
<span class="method-name">Json.stringify</span>(<span class="param">value</span>, <span class="param">indent</span>) → <span class="type">String</span>
|
||||
</div>
|
||||
<p>Converts a Wren value to a formatted JSON string with indentation.</p>
|
||||
<ul class="param-list">
|
||||
<li><span class="param-name">value</span> <span class="param-type">(any)</span> - Value to stringify</li>
|
||||
<li><span class="param-name">indent</span> <span class="param-type">(Num|String)</span> - Number of spaces or indent string</li>
|
||||
<li><span class="returns">Returns:</span> Formatted JSON string</li>
|
||||
</ul>
|
||||
<pre><code>var json = Json.stringify({"name": "Alice"}, 2)
|
||||
System.print(json)
|
||||
// {
|
||||
// "name": "Alice"
|
||||
// }
|
||||
|
||||
var json2 = Json.stringify({"name": "Bob"}, "\t")
|
||||
// Uses tab for indentation</code></pre>
|
||||
|
||||
<h2>Type Mapping</h2>
|
||||
<table>
|
||||
<tr>
|
||||
<th>JSON Type</th>
|
||||
<th>Wren Type</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>object</td>
|
||||
<td>Map</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>array</td>
|
||||
<td>List</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>string</td>
|
||||
<td>String</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>number</td>
|
||||
<td>Num</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>true/false</td>
|
||||
<td>Bool</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>null</td>
|
||||
<td>null</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h2>Examples</h2>
|
||||
|
||||
<h3>Parsing JSON</h3>
|
||||
<pre><code>import "json" for Json
|
||||
|
||||
var jsonString = '{"users": [{"name": "Alice"}, {"name": "Bob"}]}'
|
||||
var data = Json.parse(jsonString)
|
||||
|
||||
for (user in data["users"]) {
|
||||
System.print("User: %(user["name"])")
|
||||
}</code></pre>
|
||||
|
||||
<h3>Building and Stringifying</h3>
|
||||
<pre><code>import "json" for Json
|
||||
|
||||
var data = {
|
||||
"name": "Product",
|
||||
"price": 29.99,
|
||||
"tags": ["electronics", "sale"],
|
||||
"inStock": true,
|
||||
"metadata": null
|
||||
}
|
||||
|
||||
System.print(Json.stringify(data, 2))</code></pre>
|
||||
|
||||
<h3>Nested Structures</h3>
|
||||
<pre><code>import "json" for Json
|
||||
|
||||
var config = {
|
||||
"server": {
|
||||
"host": "localhost",
|
||||
"port": 8080
|
||||
},
|
||||
"database": {
|
||||
"url": "sqlite://data.db"
|
||||
}
|
||||
}
|
||||
|
||||
var json = Json.stringify(config)
|
||||
System.print(json)
|
||||
|
||||
var parsed = Json.parse(json)
|
||||
System.print(parsed["server"]["port"]) // 8080</code></pre>
|
||||
|
||||
<h3>Special Values</h3>
|
||||
<pre><code>import "json" for Json
|
||||
|
||||
var special = {
|
||||
"infinity": 1/0,
|
||||
"nan": 0/0
|
||||
}
|
||||
|
||||
System.print(Json.stringify(special))
|
||||
// {"infinity":null,"nan":null}
|
||||
// Infinity and NaN are converted to null</code></pre>
|
||||
|
||||
<div class="admonition note">
|
||||
<div class="admonition-title">Note</div>
|
||||
<p>Map keys are converted to strings in JSON output. Non-string keys will have their <code>toString</code> method called.</p>
|
||||
</div>
|
||||
|
||||
<div class="admonition warning">
|
||||
<div class="admonition-title">Warning</div>
|
||||
<p>Invalid JSON strings will cause a runtime error. Use <code>Fiber.try()</code> to catch parsing errors.</p>
|
||||
</div>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user