C# Json. NET Комплекс Camel Case - PullRequest
       1

C# Json. NET Комплекс Camel Case

0 голосов
/ 31 января 2020

Я пытаюсь сериализовать объект как camelCase, и я обнаружил, что только объекты на уровне root правильно верблюжь. Все, что ниже уровня root, называется PascalCase. Я пишу консольное приложение, используя Json. NET 12.0.3 и. NET Framework 4.0.

public class Deal
{
    public string Id { get; set; }
    public string Name { get; set; }
    public List<PublicId> PublicIds { get; set; }
}
public class PublicId
{
    public string IdType { get; set; }
    public string Value { get; set; }
}

Для сериализации я использую:

var json = JsonConvert.SerializeObject(deal, Formatting.Indented, new JsonSerializerSettings
{
    DateFormatString = "yyyy-MM-dd",
    ContractResolver = new CamelCasePropertyNamesContractResolver()
});

Результат json выглядит следующим образом:

{
  "id": null,
  "name": "Deal 1",
  "publicIds": [
    {
      "IdType": "ID1",
      "Value": "A12"
    },
    {
      "IdType": "ID2",
      "Value": "B12"
    }
  ]
}

Как видите, значения для IdType и Value не корректно сериализуются в camelCase, а скорее сериализуются в PascalCase. Существуют ситуации, когда мне нужно изменить сериализацию между PascalCase по умолчанию и camelCase, поэтому я не смогу использовать аннотации JsonProperty для принудительного включения camelCase во время сериализации. Кроме того, я бы хотел использовать Json. NET как единственную библиотеку json для моего проекта.

Есть ли чистый способ получить то, что я ищу?

1 Ответ

0 голосов
/ 01 февраля 2020

Сначала я заметил, что ваш Deal класс не инициализирует PublicIds. В этом случае код на самом деле должен выдать ошибку.

Однако ваш код, который определяет решатель контрактов CamelCasePropertyNamesContractResolver, является правильным.

Ниже приведен код консоли, который, похоже, возвращает правильное значение JSON.

public class Deal
{
    public Deal()
    {
        PublicIds = new List<PublicId>();
    }

    public string Id { get; set; }
    public string Name { get; set; }
    public List<PublicId> PublicIds { get; set; }
}

public class PublicId
{
    public string IdType { get; set; }
    public string Value { get; set; }
}

Затем в консоли, если попробовать приведенный ниже код, это, кажется, даст желаемый результат.

public static void Main()
{
    var deal = new Deal();
    deal.Name = "Deal 1";
    deal.PublicIds.Add(new PublicId { IdType = "ID1", Value = "A12" });
    deal.PublicIds.Add(new PublicId { IdType= "ID2", Value= "B12"});

    var json = JsonConvert.SerializeObject(deal, Formatting.Indented, new JsonSerializerSettings
    {
        DateFormatString = "yyyy-MM-dd",
        ContractResolver = new CamelCasePropertyNamesContractResolver()
    });

    Console.WriteLine(json);
    Console.ReadLine();
}

Вывод по коду:

{
  "id": null,
  "name": "Deal 1",
  "publicIds": [
    {
      "idType": "ID1",
      "value": "A12"
    },
    {
      "idType": "ID2",
      "value": "B12"
    }
  ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...