Я только что обновил наш Json.NET с версии 3.5 Release 7 до 4.0 Release 8 и понял, что сериализация не выполняется таким же образом. При сериализации объекта, содержащего стандартный словарь, в версии 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")]
и т.д. здесь не вариант)
Есть идеи, как это решить?