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

如何在request.Data为空时序列化出带属性名的JSON数组

解决空Data时返回含空属性对象的JSON数组问题

现有基于Newtonsoft.Json的C#序列化代码如下:

using Newtonsoft.Json;

public async Task<string> Handle(ConvertToJsonQuery request, CancellationToken cancellationToken)
{
    return Serialize(PrepareObjectForSerialization(request), LanguageEnum.HR);
}

private object PrepareObjectForSerialization(ConvertToJsonQuery request)
{
    Type listType = typeof(List<>).MakeGenericType(Type.GetType(request.TypeOfList));
    return JsonConvert.DeserializeObject(request.Data, listType);
}

private string Serialize(object obj, LanguageEnum lang)
{
    var settings = new JsonSerializerSettings
    {
        ContractResolver = new MultiLangResolver(lang),
        Formatting = Newtonsoft.Json.Formatting.Indented,
    };
    return JsonConvert.SerializeObject(obj, settings);  
}

当前代码在request.Data非空时,能正常输出如下格式的JSON数组:

[
    {
        "Institution": "19.10.",
        "FemaleTotal": 1
    },
    {
        "Institution": "my institution",
        "FemaleTotal": 2
    }
]

但当request.Data为空时,返回结果为[],需要修改代码,使其返回包含一个所有属性值为null的对象的数组,示例如下:

[
    {
        "Institution": null,
        "FemaleTotal": null             
    }
]

修改后的完整代码

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

public async Task<string> Handle(ConvertToJsonQuery request, CancellationToken cancellationToken)
{
    return Serialize(PrepareObjectForSerialization(request), LanguageEnum.HR);
}

private object PrepareObjectForSerialization(ConvertToJsonQuery request)
{
    // 获取目标元素类型
    Type itemType = Type.GetType(request.TypeOfList);
    Type listType = typeof(List<>).MakeGenericType(itemType);

    // 判断Data是否为空或空白字符串
    if (string.IsNullOrWhiteSpace(request.Data))
    {
        // 创建一个空的目标类型实例
        object emptyItem = Activator.CreateInstance(itemType);
        // 创建列表并添加空实例
        IList list = (IList)Activator.CreateInstance(listType);
        list.Add(emptyItem);
        return list;
    }

    // 原有非空Data的反序列化逻辑
    return JsonConvert.DeserializeObject(request.Data, listType);
}

private string Serialize(object obj, LanguageEnum lang)
{
    var settings = new JsonSerializerSettings
    {
        ContractResolver = new MultiLangResolver(lang),
        Formatting = Newtonsoft.Json.Formatting.Indented,
    };
    return JsonConvert.SerializeObject(obj, settings);  
}

关键改动说明

  • 在PrepareObjectForSerialization方法中增加了对request.Data的空值/空白判断
  • 当Data为空时,通过Activator.CreateInstance创建目标类型的空实例,再包装成对应类型的列表返回
  • 保留了原有非空Data时的反序列化逻辑,不影响正常场景的功能

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 05:31:33