通过媒体资源名称更改 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
,但我没有找到任何保留默认行为的示例,此外 - 允许我添加序列化的条件逻辑。
这是一个可以处理它的转换器,至少对于您的示例中的简单对象。 它查找包含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();
}
}