通过媒体资源名称更改 JSON.net 内容

本文关键字:JSON net 内容 媒体 资源 | 更新日期: 2023-09-27 18:31:46

我有这个结构:

  List<dynamic> lst = new List<dynamic>();
  lst.Add(new{objId = 1,myOtherColumn = 5});
  lst.Add(new{objId = 2,myOtherColumn = 6});
  lst.Add(new{lala = "asd" ,lala2 = 7});

我正在通过以下方式序列化它:

 string st= JsonConvert.SerializeObject(lst);

问题:

如何使序列化程序仅将"objId"属性的值更改为其他值?

我知道我应该使用 class Myconverter : JsonConverter ,但我没有找到任何保留默认行为的示例,此外 - 允许我添加序列化的条件逻辑。

通过媒体资源名称更改 JSON.net 内容

这是一个可以处理它的转换器,至少对于您的示例中的简单对象。 它查找包含objId属性的对象,然后序列化在其上找到的所有属性。 您可能需要根据需要扩展它以处理其他成员类型/更复杂的属性:

class MyConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteStartObject();
        foreach (var prop in value.GetType().GetProperties()) {
            writer.WritePropertyName(prop.Name);
            if (prop.Name == "objId") {
                //modify objId values for example
                writer.WriteValue(Convert.ToInt32(prop.GetValue(value, null)) + 10); 
            } else {
                writer.WriteValue(prop.GetValue(value, null));
            }                
        }
        writer.WriteEndObject();
    }
    public override bool CanConvert(Type objectType)
    {
        //only attempt to handle types that have an objId property
        return (objectType.GetProperties().Count(p => p.Name == "objId") == 1);
    }
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

或者,您可以使用指定它只会转换int类型的转换器,然后在执行任何转换之前查询您在 JSON 路径中的位置。 这样做的好处是不需要处理匿名类型的所有其他成员。

class MyConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        if (writer.Path.EndsWith(".objId")) {
            writer.WriteValue(Convert.ToInt32(value) + 10);
        }
        else {
            writer.WriteValue(value);
        }
    }
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof (int);
    }
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}