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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:20:57