【问题标题】:Lowercase document in CosmosDBCosmosDB 中的小写文档
【发布时间】:2019-04-10 16:54:20
【问题描述】:

我正在尝试在 CosmosDB 中以小写字母(属性名称和值)存储文档。我只想在DocumentClient 级别上实现它。 我发现下面的代码在创建客户端对象时应用JsonSerializerSettings。但这仅适用于属性名称。

var client = new DocumentClient(new Uri(""), "", serializerSettings: new JsonSerializerSettings
{
    ContractResolver = new CamelCasePropertyNamesContractResolver()
});

我可以使用下面的代码来实现这一点,但我想在DocumentClient 上的JsonSerializerSettings 上做。

var json = JsonConvert.SerializeObject(data);
var lowerCaseObject = json.ToLower();

【问题讨论】:

  • 可能是自定义合约解析器,如此处所述:stackoverflow.com/questions/6288660/…
  • 感谢您的回复,但此自定义合同解析程序仅适用于属性名称。我也想转换这些值。喜欢var json = LowercaseJsonSerializer.SerializeObject(new { Foo = "Bar" }); // { "foo": "bar" }
  • 任何cmets,请。

标签: c# json.net azure-cosmosdb documentclient


【解决方案1】:

您可以使用custom converter 执行此操作,但根据您的对象的复杂程度,这可能会变得相当复杂。例如,可以处理具有字符串和 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()
        }
    });

【讨论】:

    猜你喜欢
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多