JSON десериализовать .net Core 3 - PullRequest
0 голосов
/ 11 ноября 2019

Это действительно Basic. Десериализовать строку с новым System.Text.Json;

namespace test
{
    struct CI {
       public int Id;
       public string Name;
       public string Address;

    }
    public class test{

                        var userlist = "{\"Id\":1,\"Name\":\"Manas\",\"Address\":\"India\"}";
                        var temp2 = JsonSerializer.Deserialize<CI>(userlist,new JsonSerializerOptions { AllowTrailingCommas = true});
    }
}

, но при этом
Я просто получаю ноль для строк и 0 для Int в temp2

Это должно бытьчто-то простое, но я не понимаю

1 Ответ

0 голосов
/ 11 ноября 2019

System.Text.Json не поддерживает сериализацию поля . Функция запланирована на .NET 5.0.

Вы использовали открытые поля вместо общих свойств. Если бы вы пробовали со свойствами и точно таким же кодом:

    struct CI {
       public int Id {get;set;}
       public string Name {get;set;}
       public string Address {get;set;}
    }

Вы получите ожидаемый объект обратно:

Id        1 
Name      Manas 
Address   India 

Почему?

System.Text.JSON специально не предназначен для того, чтобы быть швейцарским десериализатором JSON, как JSON.NET. Основной вариант использования - быстрая сериализация DTO в сценарии HTTP API с минимальными выделениями, а DTO используют свойства.

Свойства - это не просто поля с геттерами и сеттерами, они являются частью интерфейса объекта. Поля, с другой стороны, рассматриваются как внутреннее состояние, даже если они являются общедоступными. Сериализаторы по умолчанию работают со свойствами , при этом сериализация полей является дополнительной функцией.

При этом значение кортежей . Теперь это фундаментальный тип, который использует поля для производительности и сокращенного копирования. Кортежи имеют свое место в DTO, но текущий System.Text.Json не может их обработать.

Работа уже ведется для этого , PR уже рассматривается, но целевая версия 5.0

...