ValueTuples теряют свои имена свойств при сериализованном

Вопрос задан: 1 год назад Последняя активность: 1 год назад
up 22 down

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

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

Я ожидаю сериализированное значение,

{ «Типа»: «А», «Текст»: «Я животное»}

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

{ «Элемент1»: «А», «Элемент2»: «Я животное»}

Есть две вещи, которые мне интересно знать

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

3 ответа

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

Реклама

up 20 down accepted

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

Что-то вроде этого:

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

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

up 16 down

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

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

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

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

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

up 2 down

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

Использование явного пользовательского типа или анонимный класс, как в @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();

Ошибка 505

Что-то пошло не так

Попробуйте воспользоваться поиском