使用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处理库,适配性强,对日期格式的解析也更灵活。
安装NuGet包:在项目中安装
Newtonsoft.Json包,可以通过NuGet包管理器或者控制台命令:Install-Package Newtonsoft.Json反序列化代码:
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+项目,无需额外安装包,性能更优。
- 反序列化代码:
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
相关产品推荐
相关产品推荐

