Строчный документ в CosmosDB
Я пытаюсь сохранить документ в нижнем регистре (имя свойства и значение) в CosmosDB. Я просто хочу сделать это на DocumentClient
уровень. Я нашел приведенный ниже код для применения JsonSerializerSettings
при создании объекта клиента. Но это будет применимо только к именам свойств.
var client = new DocumentClient(new Uri(""), "", serializerSettings: new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
});
Я могу добиться этого с помощью приведенного ниже кода, но я хотел бы сделать на JsonSerializerSettings
на DocumentClient
,
var json = JsonConvert.SerializeObject(data);
var lowerCaseObject = json.ToLower();
1 ответ
Вы можете сделать это с помощью пользовательского конвертера, но в зависимости от сложности ваших объектов, это может стать довольно сложным. Например, тот, который может обрабатывать любой объект со значениями string и 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()
}
});