我们正在使用Couchbase的最新.NET客户端,并注意到它正在将属性名称转换为camelBase,而不是PascalCase中的原始名称。
这给我们带来了问题,因为当使用N1QL进行搜索时,如果属性名称的大小写不正确,则查询不会返回任何结果。
我确实找到了一篇关于如何指定一些JSON序列化程序设置的文章,但这篇文章是在2014年写的,现在由于客户端的变化而无法工作。
有人能告诉我如何将JSON序列化程序更改为在原始/PascalCase中序列化,或者我是否可以指定为N1QL,以不用担心属性名的大小写吗?
.NET客户端在默认情况下(源代码)确实会强制所有内容进入CamelCase。
您可以通过在初始化Cluster
对象时提供自己的序列化程序来自定义此行为。您甚至可以从默认的Newtonsoftlib切换到更高效的东西,比如ServiceStack序列化程序。
您所需要做的就是在Cluster
初始化期间实现Couchbase.Core.Serialization.ITypeSerializer
接口并提供工厂方法。下面是一个实现自定义序列化程序的示例,也是一个使用它的示例
您可以在N1QL中指定不区分大小写的搜索,如下所示:
SELECT `field1`i FROM my_bucket;
这将匹配字段1、field1、字段1和任何其他情况。
另外,.NET客户端不应该修改您的字段名。如果它这样做,那就是一个错误。
您实际上不需要实现自己版本的Couchbase.Core.Serialization.ITypeSerializer
就可以从camelCase更改为PascalCase。如果您可以使用默认的序列化程序(Newtonsoft.JSON),那么您可以在ClientConfiguration
:中这样做
return new ClientConfiguration
{
Servers = _servers.ToList(),
BucketConfigs = new Dictionary<string, BucketConfiguration>
{
{ "default", new BucketConfiguration
{
Password = _password,
UseSsl = false
}}
},
UseSsl = false,
Serializer = () => new DefaultSerializer(
new JsonSerializerSettings()
{
ContractResolver = new DefaultContractResolver()
},
new JsonSerializerSettings()
{
ContractResolver = new DefaultContractResolver()
}),
};
具有讽刺意味的是,默认的合同解析器是PascalCase,但如果你不明确告诉它使用默认的合同解析程序,它将使用camelCase作为默认:)