通过属性名称更改JSON.net内容?

时间:2014-11-24 11:36:07

标签: c# json json.net

我有这个结构:

  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,但我没有找到任何保留默认行为的示例,另外 - 允许我添加序列化的条件逻辑。

1 个答案:

答案 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();
    }
}