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

使用protobuf-net将JSON转换为protogen生成的C#对象方法咨询

如何将JSON映射到Protogen生成的C#类

首先要先确认你的JSON是标准格式(键名必须用双引号包裹,属性间用逗号分隔),你给出的原始JSON需要修正为:

{
  "Id": "0000001",
  "InsertDateTime": "4/12/2018 01:01:01",
  "ModifyDateTime": "4/12/2018 01:05:10",
  "ParentId": "0000001",
  "Sample": {
    "Id": "0000002",
    "InsertDateTime": "4/12/2018 01:01:01",
    "ModifyDateTime": "4/12/2018 01:05:10"
  }
}

接下来,根据你使用的JSON序列化库,有两种常用实现方式:

方法一:使用Newtonsoft.Json(Json.NET)

这是.NET生态中最常用的JSON处理库,适配性强,对日期格式的解析也更灵活。

  1. 安装NuGet包:在项目中安装Newtonsoft.Json包,可以通过NuGet包管理器或者控制台命令:

    Install-Package Newtonsoft.Json
    
  2. 反序列化代码:

    using Newtonsoft.Json;
    
    // 假设Protogen生成的Test类是public的,且属性有正确的get/set访问器
    string json = "你的标准JSON字符串";
    Test testObj = JsonConvert.DeserializeObject<Test>(json);
    

    如果日期格式解析有问题,可以自定义日期格式设置:

    var settings = new JsonSerializerSettings
    {
        DateFormatString = "M/d/yyyy HH:mm:ss"
    };
    Test testObj = JsonConvert.DeserializeObject<Test>(json, settings);
    

方法二:使用System.Text.Json(官方内置库)

适用于.NET Core 3.0+、.NET 5+项目,无需额外安装包,性能更优。

  1. 反序列化代码:
    using System.Text.Json;
    
    string json = "你的标准JSON字符串";
    var options = new JsonSerializerOptions
    {
        PropertyNameCaseInsensitive = true, // 忽略属性大小写匹配(如果Protogen生成的属性名和JSON键名大小写不一致时有用)
    };
    // 自定义日期转换器处理指定格式
    options.Converters.Add(new System.Text.Json.Serialization.JsonConverter<DateTime>()
    {
        Read = (reader, typeToConvert, options) =>
            DateTime.ParseExact(reader.GetString(), "M/d/yyyy HH:mm:ss", null),
        Write = (writer, value, options) =>
            writer.WriteStringValue(value.ToString("M/d/yyyy HH:mm:ss"))
    });
    
    Test testObj = JsonSerializer.Deserialize<Test>(json, options);
    

注意事项

  • 确保Protogen生成的Test和Sample类是public访问修饰符,且所有需要映射的属性都有get和set方法(默认生成的类通常满足这个要求,但如果有自定义配置需要检查)。
  • 如果JSON中的属性名和Protogen生成的类属性名不一致,可以通过添加特性来映射:
    // Newtonsoft.Json
    [JsonProperty("InsertDateTime")]
    public DateTime InsertDate { get; set; }
    
    // System.Text.Json
    [JsonPropertyName("InsertDateTime")]
    public DateTime InsertDate { get; set; }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:29:54