您可以使用自定义转换器来执行此操作,但根据您的对象的复杂程度,这可能会变得非常复杂。例如,可以处理具有字符串和 int 值的任何对象以及 IEnumerables 的对象看起来像这样:
public class CaseConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return true;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (value.GetType() == typeof(string) || value.GetType() == typeof(int))
{
writer.WriteValue(value.ToString().ToLower());
}
else
{
var enumerable = value as System.Collections.IEnumerable;
if (enumerable != null)
{
writer.WriteStartArray();
foreach (var item in enumerable)
{
serializer.Serialize(writer, item);
}
writer.WriteEndArray();
}
else
{
writer.WriteStartObject();
PropertyInfo[] properties = value.GetType().GetProperties();
foreach (PropertyInfo pi in properties)
{
writer.WritePropertyName(pi.Name.ToLower());
serializer.Serialize(writer, pi.GetValue(value));
}
writer.WriteEndObject();
}
}
}
如果您知道要序列化的对象类型是什么,则可以将转换器编写为特定于该类型,而不是使用反射。
调用自定义转换器时,只需将其添加到序列化程序设置中。
var client = new DocumentClient(new Uri(""), "", serializerSettings: new JsonSerializerSettings
{
Converters = new List<JsonConverter>
{
new CaseConverter()
}
});