Строчный документ в CosmosDB - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь сохранить документ в нижнем регистре (имя свойства и значение) в 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 Ответ

0 голосов
/ 29 апреля 2019

Вы можете сделать это, используя пользовательский конвертер , но в зависимости от сложности ваших объектов, это может стать довольно сложным.Например, тот, который может обрабатывать любой объект со значениями 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()
        }
    });
...