C#修改JSON的Overs值后丢失$id与$type字段,求解决方案
解决Newtonsoft.Json修改后丢失$id和$type字段的问题
嗨,我来帮你搞定这个问题——你遇到的情况是因为用dynamic反序列化时,Newtonsoft.Json对$id和$type这类元数据字段的默认处理逻辑,导致它们在重新序列化时被丢弃了。下面给你几种可行的解决方案:
方法1:改用JObject直接操作(最直接)
放弃dynamic,换成JObject来处理JSON,这样所有原始字段都会被完整保留:
var jsonString = sSession.GameState; JObject jsonObject = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(jsonString); jsonObject["Overs"] = 10; // 修改Overs的值 var modifiedJsonString = Newtonsoft.Json.JsonConvert.SerializeObject(jsonObject);
这样生成的JSON就会包含$id、$type以及其他所有原始字段了。
方法2:配置序列化设置保留元数据
如果你还是想用dynamic,可以在序列化的时候指定特殊配置,让Newtonsoft.Json保留这些元数据字段:
var jsonString = sSession.GameState; dynamic jsonObject = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonString); jsonObject.Overs = 10; var serializerSettings = new Newtonsoft.Json.JsonSerializerSettings { // 自动处理类型元数据 TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Auto, // 读取并保留元数据属性 MetadataPropertyHandling = Newtonsoft.Json.MetadataPropertyHandling.ReadAhead }; var modifiedJsonString = Newtonsoft.Json.JsonConvert.SerializeObject(jsonObject, serializerSettings);
方法3:定义强类型类(最佳实践)
如果你的JSON结构是固定的,最靠谱的方式是定义一个对应的类,用强类型来操作,这样不仅能保留所有字段,还能获得编译时的类型检查:
// 定义和JSON结构对应的类 public class OutdoorGame { [JsonProperty("$id")] public string Id { get; set; } [JsonProperty("$type")] public string Type { get; set; } public int Overs { get; set; } public int Balls { get; set; } public string TeamName { get; set; } } // 使用强类型处理 var jsonString = sSession.GameState; OutdoorGame game = Newtonsoft.Json.JsonConvert.DeserializeObject<OutdoorGame>(jsonString); game.Overs = 10; var modifiedJsonString = Newtonsoft.Json.JsonConvert.SerializeObject(game);
这种方式能彻底避免dynamic带来的不确定性,代码也更易维护。
内容的提问来源于stack exchange,提问作者Arul Joseph
相关产品推荐
相关产品推荐

