使用小写属性值序列化为JSON

时间:2015-08-27 15:39:41

标签: c# unit-testing json.net moq

我有一个操作层,可以获取注入其中的Entity Framework数据库上下文。我通过使用Moq模拟数据库上下文来编写操作层的单元测试,如here所述。模拟数据以JSON格式存储在文本文件中,这些文件是从真实数据库中的数据创建的,因为数据太复杂而无法从头开始构建。

除了一个小问题外,一切顺利。在测试一些查询函数时,我遇到了区分大小写的问题。当应用程序运行时,它会将LINQ查询转换为SQL;由于like %search value%不区分大小写,因此搜索词的大小写并不重要。但是,由于模拟数据是从JSON加载而不是通过SQL,因此测试失败的时候他们不应该这样做。

例如,我有两个模拟记录,一个字段值为' Port Gamble A'另一个有PORT GAMBLE B'搜索' gamble'没有找到任何模拟记录,也没有找到' Gamble'只找到一个。

现在,我在反序列化之后只是在名称字段上调用.ToLower()来解决这个问题,但是我想测试搜索和调用{{1}的子对象中有很多文本字段。每一个人都会感到痛苦。手动编辑JSON以减少一切情况甚至更糟。我也不想更改LINQ查询以在搜索词和数据库字段上调用.ToLower(),因为仅仅针对单元测试更改查询似乎很愚蠢,并且它可能会产生一些性能影响。

有没有办法自定义序列化以强制所有字符串值小写?我找到了很多关于如何降低属性名称的例子,但没有找到实际值。

编辑:嗯,这很容易。对于那些对解决方案感兴趣的人:

字符串值的自定义JSON转换器:

.ToLower()

使用public class LowerCaseJsonConverter : JsonConverter { public override bool CanConvert(Type objectType) { return objectType == typeof(string); } 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) { writer.WriteValue(value.ToString().ToLower()); } }

序列化EF实体
LowerCaseJsonConverter

1 个答案:

答案 0 :(得分:2)

我假设你正在使用Json.Net,你只需要使用自定义序列化程序,你可以添加你想要的任何逻辑属性名称和值

http://blog.maskalik.com/asp-net/json-net-implement-custom-serialization/