C#中如何为类添加动态JSON成员并避免双重序列化?
解决EventData类添加动态JSON字段的双重序列化问题
针对你的场景,核心问题是直接用string类型存储JSON字符串会被序列化器转义,导致最终请求体里的HealthInfo是带引号的转义字符串而非原始JSON结构。下面给出两种常用JSON序列化库的解决方案:
方案一:使用Newtonsoft.Json(Json.NET)的JToken类型
- 确保项目已引用Newtonsoft.Json包
- 修改EventData类,将HealthInfo字段定义为
JToken类型:
using Newtonsoft.Json.Linq; public class EventData { public string deviceJobId { get; set; } public int eventID { get; set; } public long time_ms { get; set; } // 新增字段,用于存储动态JSON结构 public JToken HealthInfo { get; set; } /// similar fields }
- 读取文件中的JSON字符串并赋值:
// 读取文件内容 string healthInfoJson = File.ReadAllText("healthinfo.json"); // 解析为JToken EventData eventData = new EventData { deviceJobId = "xxx", eventID = 1, time_ms = DateTimeOffset.Now.ToUnixTimeMilliseconds(), HealthInfo = JToken.Parse(healthInfoJson) }; // 序列化整个EventData,此时HealthInfo会直接作为JSON结构嵌入 string requestJson = JsonConvert.SerializeObject(eventData);
方案二:使用System.Text.Json的JsonElement类型
如果使用.NET Core/.NET 5+自带的System.Text.Json:
- 修改EventData类,将HealthInfo定义为
JsonElement类型:
using System.Text.Json; public class EventData { public string deviceJobId { get; set; } public int eventID { get; set; } public long time_ms { get; set; } // 新增字段 public JsonElement HealthInfo { get; set; } /// similar fields }
- 读取文件并赋值(注意处理JsonDocument的生命周期):
string healthInfoJson = File.ReadAllText("healthinfo.json"); using JsonDocument doc = JsonDocument.Parse(healthInfoJson); EventData eventData = new EventData { deviceJobId = "xxx", eventID = 1, time_ms = DateTimeOffset.Now.ToUnixTimeMilliseconds(), // 克隆RootElement避免文档释放后失效 HealthInfo = doc.RootElement.Clone() }; // 序列化 string requestJson = JsonSerializer.Serialize(eventData);
这两种方案的核心逻辑一致:用JSON序列化器原生支持的动态JSON类型存储内容,序列化时会直接将其转换为对应的JSON结构,而非转义成字符串,完美避免双重序列化问题。
内容的提问来源于stack exchange,提问作者the.cicada.himself
相关产品推荐
相关产品推荐

