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

Newtonsoft.Json反序列化dynamic属性为LdrEntity类型方案

问题根因

Newtonsoft.Json(Json.NET)反序列化dynamic类型声明的属性时,没有静态类型作为绑定依据,默认不会自动将嵌套JSON结构映射为你预期的LdrEntity实例。你遇到属性值为纯JSON字符串的情况,本质是序列化/反序列化流程没有给dynamic属性配置明确的类型映射规则,解析器无法判断目标转换类型。

解决方案

按优先级选以下方案即可:

方案1:直接声明明确属性类型(最推荐,零额外配置)

如果LdrReagentEntity、BciReagentEntity两个属性运行时固定存储LdrEntity类型,不需要兼容其他动态类型,直接把属性类型从dynamic改成LdrEntity即可,Json.NET会自动完成类型映射,原有序列化、反序列化逻辑不需要任何调整:

public class CocktailReagentItem
{
    public string Id { get; set; }
    public uint Index { get; set; }
    public uint Volume { get; set; }
    // 替换dynamic为明确的LdrEntity类型
    public LdrEntity LdrReagentEntity { get; set; }
    public LdrEntity BciReagentEntity { get; set; }
}

方案2:保留dynamic类型,开启类型名称持久化

如果确实需要保留dynamic声明(比如后续可能存储其他类型实例),序列化时开启类型元数据写入配置,反序列化时读取元数据自动还原对应类型:

序列化逻辑调整

var exportStr = JsonConvert.SerializeObject(exportObj, Formatting.Indented, new JsonSerializerSettings
{
    // 仅对dynamic/object类型的属性写入类型元数据,不增加冗余字段
    TypeNameHandling = TypeNameHandling.Auto
});

反序列化逻辑调整

var obj = JsonConvert.DeserializeObject<LdrExportObj>(str, new JsonSerializerSettings
{
    // 读取JSON中携带的类型元数据,还原为对应类型实例
    TypeNameHandling = TypeNameHandling.Auto
});

注意:该方案不要用于反序列化非信任来源的JSON,避免类型注入安全风险;如果序列化和反序列化跨程序集,需要自定义SerializationBinder做类型名称映射。

方案3:自定义JsonConverter固定转换类型

如果已经生成了历史JSON文件(没有携带类型元数据),也不想修改原有属性声明,可以通过自定义转换器固定两个dynamic属性的反序列化目标类型:

  1. 给两个属性添加转换器特性
public class CocktailReagentItem
{
    public string Id { get; set; }
    public uint Index { get; set; }
    public uint Volume { get; set; }
    [JsonConverter(typeof(LdrEntityConverter))]
    public dynamic LdrReagentEntity { get; set; }
    [JsonConverter(typeof(LdrEntityConverter))]
    public dynamic BciReagentEntity { get; set; }
}
  1. 实现自定义转换器
public class LdrEntityConverter : JsonConverter
{
    public override bool CanConvert(Type objectType) => true;
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // 反序列化时固定转换为LdrEntity实例
        return serializer.Deserialize<LdrEntity>(reader);
    }
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        // 序列化时按原逻辑输出对象结构
        serializer.Serialize(writer, value);
    }
}
效果验证

调整后反序列化的对象中,两个原dynamic属性会被正确还原为LdrEntity类型实例,不会再出现值为JSON字符串的问题。
dynamic属性反序列化状态参考

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 06:30:38