我有这个结构:
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);
问题:
如何使序列化程序仅更改&#34; objId
&#34;的值财产,还有其他什么?
我知道我应该使用class Myconverter : JsonConverter
,但我没有找到任何保留默认行为的示例,另外 - 允许我添加序列化的条件逻辑。
答案 0 :(得分:2)
这是一个可以处理它的转换器,至少对于简单的对象,根据你的例子。它查找包含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();
}
}