我刚刚将我们的 Json.NET 从版本 3.5 Release 7 升级到 4.0 Release 8,并意识到序列化不是以相同的方式完成的。序列化包含标准 Dictionary 的对象时,3.5 版本保持字典键不变,但使用 4.0 时,合同解析器也适用于键。
例如,当使用以下 JsonSerializerSettings 时:
jsonSerializerSettings = new JsonSerializerSettings
{
Converters = new List<JsonConverter> { new JavaScriptDateTimeConverter() },
NullValueHandling = NullValueHandling.Ignore,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
并且在序列化像这样的对象时:
[JsonObject(MemberSerialization.OptOut)]
public class ProductFilter
{
public int Id { get; set; }
public int NodeId { get; set; }
public IDictionary<string, ProductFilterAttribute> Attributes { get; set; }
}
字典中的键Attributes
也变成了 camelCase。在 3.5R7 版本中,那些保持不变,我认为这是正确的方法。
来自 3.5R7 输出的示例片段:
{
"id": 98659,
"nodeId": 317970,
"attributes": {
"FULL_TIME_USE": {
values: [ { "1" } ],
formattedValue: "...
来自 4.0R8 输出的示例片段:
{
"id": 98659,
"nodeId": 317970,
"attributes": {
"fULL_TIME_USE": {
values: [ { "1" } ],
formattedValue: "...
(我们有很多类似的代码,所以删除 camelCase 解析和添加[JsonProperty("id")]
等[JsonProperty("nodeId")]
并不是一个真正的选择)
关于如何解决这个问题的任何想法?