Skip to content

RPC JSON Serializer

This serializer handles JSON payloads for the RPC Protocol and supports native data types.

Extending Native Data Types

Extend native types by creating your own StandardRPCCustomJsonSerializer and adding it to the customJsonSerializers option.

  1. Define Your Custom Serializer

    ts
    import type { StandardRPCCustomJsonSerializer } from '@orpc/client/standard'
    
    export class 
    User
    {
    constructor( public readonly
    id
    : string,
    public readonly
    name
    : string,
    public readonly
    email
    : string,
    public readonly
    age
    : number,
    ) {}
    toJSON
    () {
    return {
    id
    : this.
    id
    ,
    name
    : this.
    name
    ,
    email
    : this.
    email
    ,
    age
    : this.
    age
    ,
    } } } export const
    userSerializer
    : StandardRPCCustomJsonSerializer = {
    type
    : 21,
    condition
    :
    data
    =>
    data
    instanceof
    User
    ,
    serialize
    :
    data
    =>
    data
    .toJSON(),
    deserialize
    :
    data
    => new
    User
    (
    data
    .id,
    data
    .name,
    data
    .email,
    data
    .age),
    }

    WARNING

    Ensure the type is unique and greater than 20 to avoid conflicts with built-in types in the future.

  2. Use Your Custom Serializer

    ts
    const 
    handler
    = new
    RPCHandler
    (
    router
    , {
    customJsonSerializers
    : [
    userSerializer
    ],
    }) const
    link
    = new
    RPCLink
    ({
    url
    : 'https://example.com/rpc',
    customJsonSerializers
    : [
    userSerializer
    ],
    })

Overriding Built-in Types

You can override built-in types by matching their type with the built-in types.

For example, oRPC represents undefined only in array items and ignores it in objects. To override this behavior:

ts
import { StandardRPCCustomJsonSerializer } from '@orpc/client/standard'

export const 
undefinedSerializer
: StandardRPCCustomJsonSerializer = {
type
: 3, // Match the built-in undefined type.
condition
:
data
=>
data
===
undefined
,
serialize
:
data
=> null, // JSON cannot represent undefined, so use null.
deserialize
:
data
=>
undefined
,
}

Released under the MIT License.