# JSON Support
DWScript provides built-in, high-performance JSON support through the `JSON` object and the `JSONVariant` type.
## Core Methods
| Method | Parameters | Description |
| :--- | :--- | :--- |
| `Parse` | `jsonStr` | Parses JSON string into a `JSONVariant`. |
| `Stringify` | `value` | Converts a value (Record, Class, Array, etc) to a JSON string. |
| `PrettyStringify` | `value [, indent]` | Formats JSON for readability. |
| `Serialize` | `value` | Converts a native value into a `JSONVariant` object. |
| `NewObject / NewArray` | ` ` | Creates a dynamic JSON container. |
### Serializing vs Stringifying
While `Stringify` produces a JSON **String**, `Serialize` converts a native value directly into a `JSONVariant` object. This allows you to manipulate the structure before generating the final string.
```pascal
var p := record x := 10; y := 20; end;
// Convert to JSONVariant, modify, then stringify
var j := JSON.Serialize(p);
j.x := 100;
PrintLn(j.ToString());
// OUTPUT
// {"x":100,"y":20}
```
## Serialization Rules
DWScript uses a set of consistent rules for automatic serialization via `JSON.Stringify`:
| Type | Inclusion Rule |
| :--- | :--- |
| **Classes** | Only **published** fields and properties are included. |
| **Named Records** | Only **published** fields are included. |
| **Anonymous Records** | **All** fields are automatically included. |
| **Arrays** | All elements are included as a JSON array. |
### Example: Classes
```pascal
type
TUser = class
published
Name : String;
Age : Integer;
private
InternalId : Integer; // Will be ignored
end;
var u := new TUser;
u.Name := 'Alice'; u.Age := 30;
PrintLn(JSON.Stringify(u));
// OUTPUT
// {"Age":30,"Name":"Alice"}
```
## Dynamic Access
Using `JSONVariant`, you can access keys using dot notation or array indexing.
```pascal
var data := JSON.Parse('{"items": [10, 20]}');
PrintLn(data.items[0]);
// OUTPUT
// 10
```
## JSONVariant Helper Methods
When working with `JSONVariant`, several helper methods are available. Note that these **must** be called with parentheses `()` to avoid conflict with JSON field names.
| Method | Returns | Description |
| :--- | :--- | :--- |
| `Defined()` | `Boolean` | Returns `True` if the value is not `Undefined`. |
| `Length()` | `Integer` | Returns the number of elements (Array) or keys (Object). |
| `Low()` | `Integer` | Returns the lowest index (usually 0). |
| `High()` | `Integer` | Returns the highest index of an array. |
| `Add(item)` | `Integer` | Appends an item to a JSON array. Returns the new index. |
| `Push(item)` | `Integer` | Alias for `Add`. |
| `Delete(id)` | `(none)` | Removes an item by index (Array) or key name (Object). |
| `Swap(i, j)` | `(none)` | Swaps two elements in an array. |
| `Clone()` | `JSONVariant` | Returns a deep copy of the structure. |
| `ToString()` | `String` | Returns the JSON string representation. |
| `TypeName()` | `String` | Returns 'Object', 'Array', 'String', 'Number', 'Boolean', 'Null' or 'Undefined'. |
| `ElementName(i)` | `String` | Returns the key name at the given index (for Objects). |
| `AsInteger / AsFloat` | ` ` | Explicit conversion helpers. |
| `AsString / AsBoolean` | ` ` | Explicit conversion helpers. |
## Specialized Parsers
For high-performance scenarios, these static methods on the `JSON` object parse strings directly into native Pascal arrays, bypassing `JSONVariant` overhead.
| Method | Parameters | Returns |
| :--- | :--- | :--- |
| `ParseIntegerArray` | `(jsonStr)` | `array of Integer` |
| `ParseFloatArray` | `(jsonStr)` | `array of Float` |
| `ParseStringArray` | `(jsonStr)` | `array of String` |
:::info
### Auto-Serialization
DWScript can automatically stringify complex types like **Records** and **Classes**. Simply pass the instance to `JSON.Stringify`.
:::
JSON Support
DWScript provides built-in, high-performance JSON support through the JSON object and the JSONVariant type.
Core Methods
Method
Parameters
Description
Parse
jsonStr
Parses JSON string into a JSONVariant.
Stringify
value
Converts a value (Record, Class, Array, etc) to a JSON string.
PrettyStringify
value [, indent]
Formats JSON for readability.
Serialize
value
Converts a native value into a JSONVariant object.
NewObject / NewArray
Creates a dynamic JSON container.
Serializing vs Stringifying
While Stringify produces a JSON String, Serialize converts a native value directly into a JSONVariant object. This allows you to manipulate the structure before generating the final string.
var p :=record x :=10; y :=20;end;// Convert to JSONVariant, modify, then stringifyvar j := JSON.Serialize(p);
j.x :=100;
PrintLn(j.ToString());
Result
{"x":100,"y":20}
Serialization Rules
DWScript uses a set of consistent rules for automatic serialization via JSON.Stringify:
Type
Inclusion Rule
Classes
Only published fields and properties are included.
Named Records
Only published fields are included.
Anonymous Records
All fields are automatically included.
Arrays
All elements are included as a JSON array.
Example: Classes
type
TUser =classpublished
Name :String;
Age :Integer;private
InternalId :Integer;// Will be ignoredend;var u :=new TUser;
u.Name :='Alice'; u.Age :=30;
PrintLn(JSON.Stringify(u));
Result
{"Age":30,"Name":"Alice"}
Dynamic Access
Using JSONVariant, you can access keys using dot notation or array indexing.
var data := JSON.Parse('{"items": [10, 20]}');
PrintLn(data.items[0]);
Result
10
JSONVariant Helper Methods
When working with JSONVariant, several helper methods are available. Note that these must be called with parentheses () to avoid conflict with JSON field names.
Method
Returns
Description
Defined()
Boolean
Returns True if the value is not Undefined.
Length()
Integer
Returns the number of elements (Array) or keys (Object).
Low()
Integer
Returns the lowest index (usually 0).
High()
Integer
Returns the highest index of an array.
Add(item)
Integer
Appends an item to a JSON array. Returns the new index.
Push(item)
Integer
Alias for Add.
Delete(id)
(none)
Removes an item by index (Array) or key name (Object).
Swap(i, j)
(none)
Swaps two elements in an array.
Clone()
JSONVariant
Returns a deep copy of the structure.
ToString()
String
Returns the JSON string representation.
TypeName()
String
Returns 'Object', 'Array', 'String', 'Number', 'Boolean', 'Null' or 'Undefined'.
ElementName(i)
String
Returns the key name at the given index (for Objects).
AsInteger / AsFloat
Explicit conversion helpers.
AsString / AsBoolean
Explicit conversion helpers.
Specialized Parsers
For high-performance scenarios, these static methods on the JSON object parse strings directly into native Pascal arrays, bypassing JSONVariant overhead.
Method
Parameters
Returns
ParseIntegerArray
(jsonStr)
array of Integer
ParseFloatArray
(jsonStr)
array of Float
ParseStringArray
(jsonStr)
array of String
Auto-Serialization
DWScript can automatically stringify complex types like Records and Classes. Simply pass the instance to JSON.Stringify.