Могу ли я заполнить только необработанное значение 100 для «Имя» вместо ValueKind = Number: «100 - PullRequest
0 голосов
/ 20 апреля 2020

Одна из C# сторонних библиотек сериализует / десериализует такие вещи, как System.Text.Json.JsonSerializer, не используя Newtonsoft, как в примере ниже,

string test = "[{\"Id\":86,\"Name\":\"test\"},{\"Id\":87,\"Name\":100}]";
        var SystemTextJson = System.Text.Json.JsonSerializer.Deserialize<List<Data>>(test);

 public class Data
{
    public int Id { get; set; }

    public object Name { get; set; }
}

Здесь Name имеет тип object, и это работает , но я вижу valueKind = Number : "100" и valueKind = string : "test". Могу ли я заполнить Name только необработанным значением 100, test? как, пожалуйста, предложите.

enter image description here

1 Ответ

1 голос
/ 20 апреля 2020

Я думаю, что в этом случае, вероятно, проще создать свой собственный класс JsonConverter<T>. Тогда вам не нужно беспокоиться о JsonElement и преобразовывать значения по мере их поступления.

public class MyCustomConverter : JsonConverter<Data>
{
    public override Data Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType != JsonTokenType.StartObject)
        {
            throw new JsonException();
        }

        var data = new Data();

        while (reader.Read())
        {
            if (reader.TokenType == JsonTokenType.EndObject)
            {
                return data;
            }

            if (reader.TokenType == JsonTokenType.PropertyName)
            {
                string propertyName = reader.GetString();
                reader.Read();
                switch (propertyName)
                {
                    case "Id":
                        data.Id = reader.GetInt32();
                        break;
                    case "Name":
                        if (reader.TokenType == JsonTokenType.Number)
                        {
                            data.Name = reader.GetInt32();
                        }
                        else if (reader.TokenType == JsonTokenType.String)
                        {
                            data.Name = reader.GetString();
                        }
                        break;
                }
            }

        }
        throw new JsonException();
    }

    public override void Write(Utf8JsonWriter writer, Data value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString());
    }
}

Затем вы можете добавить этот преобразователь в настройки JSON сериализатора и десериализовать ваши JSON:

var serializeOptions = new JsonSerializerOptions();

serializeOptions.Converters.Add(new MyCustomConverter());

var data = JsonSerializer.Deserialize<List<Data>>(test, serializeOptions);

Полная демонстрация по dotnetfiddle. net

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...