You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ballerina中自定义Date记录的JSON序列化格式?

问题描述

我有如下Ballerina代码片段:

import ballerina/io;

type Date record {|
    string year;
    string month?;
    string day?;
|};

public function main() {

    Date birthDate = {
        year: "1980",
        month: "6",
        day: "20"
    };

    io:print(birthDate.toJson());
}

该代码输出的默认JSON格式为:

{
    "year": "1980",
    "month": "6",
    "day": "20"
}

需求是:保留Date记录类型不变,将birthDate序列化为如下自定义JSON格式:

{
   "birthdate": "1980-6-20"
}

请问在Ballerina中是否有方法自定义Date记录的JSON序列化以实现该格式?

实现方案

可以通过两种方式实现,核心是不修改原Date记录定义,在序列化阶段做自定义转换:

方法1:手动编写转换函数

这种方式简单直接,适合场景明确的情况:

import ballerina/io;
import ballerina/json;

type Date record {|
    string year;
    string month?;
    string day?;
|};

// 将Date实例转换为目标JSON结构的自定义函数
function dateToCustomJson(Date date) returns json {
    string dateStr = date.year;
    if (date.month is string) {
        dateStr += "-" + date.month;
        if (date.day is string) {
            dateStr += "-" + date.day;
        }
    }
    return {"birthdate": dateStr};
}

public function main() {
    Date birthDate = {
        year: "1980",
        month: "6",
        day: "20"
    };

    json customJson = dateToCustomJson(birthDate);
    io:println(json:toString(customJson, prettyPrint = true));
}

运行后输出的JSON完全符合需求,同时保留了原Date记录的定义。

方法2:使用json:Transformer自定义序列化规则

如果需要在多个场景复用自定义序列化逻辑,可以借助json:Transformer扩展:

import ballerina/io;
import ballerina/json;
import ballerina/lang.value;

type Date record {|
    string year;
    string month?;
    string day?;
|};

// 自定义转换器,专门处理Date类型的序列化
class CustomDateTransformer {
    *json:Transformer;

    // 重写serialize方法,对Date类型做自定义处理
    public function serialize(value:Value val) returns json|error {
        if val is Date {
            string dateStr = val.year;
            if (val.month is string) {
                dateStr += "-" + val.month;
                if (val.day is string) {
                    dateStr += "-" + val.day;
                }
            }
            return {"birthdate": dateStr};
        }
        // 其他类型沿用默认序列化逻辑
        return self.defaultSerialize(val);
    }
}

public function main() returns error? {
    Date birthDate = {
        year: "1980",
        month: "6",
        day: "20"
    };

    CustomDateTransformer transformer = new();
    json customJson = check transformer.serialize(birthDate);
    io:println(json:toString(customJson, prettyPrint = true));
}

这种方式灵活性更高,适合需要对多种类型做自定义序列化的场景,同样不会修改原Date记录的定义。

内容的提问来源于stack exchange,提问作者Chiran Sachintha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 15:43:11