XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEExtension

【DLL】XFE各类拓展是一个C#的DLL库,旨在优化C#代码中常用语句的使用,并提供更简洁的访问方式,同时提供Xunit测试框架,快速搭建服务器/客户端,免费ChatGPTAPI接口,免费通讯服务器,XFE下载器,新增格式等

公开
关注 0 Fork 0 Star 0
UTF-8
namespace XFEExtension.NetCore.XFETransform.Json;

/// <summary>
/// XFE JSON 的惰性解析、验证、序列化和反序列化入口。
/// </summary>
public static class XFEJson
{
    /// <summary>
    /// 创建惰性 JSON 根节点。此操作不会验证或扫描完整 JSON。
    /// </summary>
    public static XFEJsonNode Parse(string json, XFEJsonOptions? options = null)
    {
        ArgumentNullException.ThrowIfNull(json);
        var source = new JsonSource(json, JsonSettings.Create(options));
        return new XFEJsonNode(source, 0, -1, XFEJsonValueKind.Undefined, "$", 0, isRoot: true);
    }

    /// <summary>
    /// 验证完整 JSON 文本。
    /// </summary>
    public static void Validate(string json, XFEJsonOptions? options = null)
    {
        ArgumentNullException.ThrowIfNull(json);
        JsonScanner.ValidateDocument(new JsonSource(json, JsonSettings.Create(options)));
    }

    /// <summary>
    /// 尝试验证完整 JSON 文本。
    /// </summary>
    public static bool TryValidate(string json, out XFEJsonError? error, XFEJsonOptions? options = null)
    {
        ArgumentNullException.ThrowIfNull(json);
        try
        {
            Validate(json, options);
            error = null;
            return true;
        }
        catch (XFEJsonException exception)
        {
            error = exception.Error;
            return false;
        }
    }

    /// <summary>
    /// 将值序列化为 JSON 文本。
    /// </summary>
    public static string Serialize<T>(T? value, XFEJsonOptions? options = null) =>
        JsonCodec.Serialize(value, typeof(T), JsonSettings.Create(options));

    /// <summary>
    /// 将 JSON 文本反序列化为指定类型。
    /// </summary>
    public static T? Deserialize<T>(string json, XFEJsonOptions? options = null)
    {
        ArgumentNullException.ThrowIfNull(json);
        var node = Parse(json, options);
        var result = node.Deserialize<T>();
        node.Validate();
        return result;
    }

    /// <summary>
    /// 将 JSON 文本反序列化为运行时指定的类型。
    /// </summary>
    public static object? Deserialize(string json, Type targetType, XFEJsonOptions? options = null)
    {
        ArgumentNullException.ThrowIfNull(json);
        ArgumentNullException.ThrowIfNull(targetType);
        var settings = JsonSettings.Create(options);
        var node = Parse(json, options);
        var result = JsonCodec.Deserialize(node, targetType, settings);
        node.Validate();
        return result;
    }
}