ValueTuples теряют имена своих свойств при сериализации - PullRequest
0 голосов
/ 28 января 2019

При попытке сериализации именованного значения в строку JSON он теряет имена, присвоенные элементам

(string type, string text) myTypes = ("A", "I am an animal");
var cnvValue = JsonConvert.SerializeObject(myTypes);

Я ожидаю, что сериализованное значение будет иметь тип

{"":" A "," text ":" Я - животное "}

, но фактические результаты

{" Item1 ":" A ","Item2 ":" Я - животное "}

Мне интересно знать две вещи

  • Почему он так себя ведет
  • Как получить ожидаемый результат

Ответы [ 3 ]

0 голосов
/ 28 января 2019

Как получить ожидаемый результат

Примерно так:

var myTypes = new{ type = "A", text = "I am an animal"};
var cnvValue = JsonConvert.SerializeObject(myTypes);

должно работать, если вы ищете такой же краткий подход.Хотя не использует ValueTuple s (но анонимные типы) под капотом;это моя интерпретация вашего вопроса как «как я могу создать этот ожидаемый JSON без полной декларации класса и т. д.»

0 голосов
/ 04 февраля 2019

Как получить ожидаемый результат

Используйте явный пользовательский тип или анонимный класс, как в ответе @Caius.

Или не создавайте специальный тип для него ввсе (для компилятора анонимного типа для вас создается класс за сценой) и используйте JObject для динамического создания json:

var myTypesJson = new JObject(
    new JProperty("type", "A"), 
    new JProperty("text", "I am an animal")
);
var cnvValue = myTypesJson.ToString();

или используйте индексатор и инициализацию синтаксис дляэто:

var createdJson = new JObject()
{
    ["type"] = "A",
    ["text"] = "I am an animal"
};
var cnvValue = createdJson.ToString();
0 голосов
/ 28 января 2019

Имена - это трюк с компилятором.Если вы посмотрите на определение ValueTuple, вы увидите, что его имена полей просто Item1, Item2 и т. Д.

Поскольку JsonConvert.SerializeObject был скомпилирован задолго до этоговы назначили имена, которые могли бы использовать во время вашей компиляции, она не может восстановить имена.

Параметры метода / типы возврата украшены атрибутами , которые указывают имена, которые должны бытьиспользуется, когда подпись метода включает ValueTuple s.Это позволяет коду, созданному позже, «видеть» имена, выполняемые компилятором снова, но это «неправильный путь», который будет здесь очень полезен.

Как получить ожидаемый результат

Введите явный тип, если имена полей / свойств так важны.

...