Utf8JsonReader.ToString дает: Невозможно получить значение типа токена 'None' - PullRequest
1 голос
/ 07 августа 2020

Обратите внимание, это для System.Text. Json, а не Json. Net, поэтому Как модульное тестирование пользовательского JsonConverter не является дубликатом.

Мне нравится модульное тестирование моего пользовательского JsonConverter:

using System.Text.Json;

public class DateTimeShortConverter : JsonConverter<DateTime>
{
    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        // support yyyy-MM-dd but also with times
        return DateTime.Parse(reader.GetString());
    }

    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString("yyyy-MM-dd"));
    }

Мне нужен Utf8JsonReader, и мне нужно накормить его string.

Я пробовал это:

byte[] bytes = Encoding.UTF8.GetBytes("2019-01-02");
var reader = new Utf8JsonReader(bytes.AsSpan());

Кажется, что работает, но при выполнении reader.GetString():

System.InvalidOperationException: невозможно получить значение типа токена. «Нет» в виде строки. в System.Text. Json .Utf8JsonReader.GetString ()

reader.GetString() должно быть правильным, см. пример Microsoft , поэтому я думаю, что я кормлю Utf8JsonReader неправильно.

reader.Position доступно только для чтения, так что это тоже не вариант. Как мне правильно кормить Utf8JsonReader строкой?

Полный тест:

using System;
using System.Text;
using System.Text.Json;
Using Xunit;

[Fact]
public void ReadDateTimeTests()
{
    // Arrange
    var input = "2019-01-02";

    var dateTimeShortConverter = new DateTimeShortConverter();
    byte[] bytes = Encoding.UTF8.GetBytes(input);
    var reader = new Utf8JsonReader(bytes.AsSpan());

    Type typeToConvert = typeof(DateTime);
    JsonSerializerOptions options = new JsonSerializerOptions();

    var expected = new DateTime(2019, 01, 02);

    // Act
    var result = dateTimeShortConverter.Read(ref reader, typeToConvert, options);

    // Assert
    Assert.Equal(expected, result);
}

обновление: это также не отвечает на мой вопрос: Исключение при тестировании пользовательского JsonConverter . Я тоже пробовал (из этого ответа) без везения:

byte[] bytes = Encoding.UTF8.GetBytes(input);
var reader = new Utf8JsonReader(bytes.AsSpan(), false, new JsonReaderState(new JsonReaderOptions()));

Обновление

"2019-01-02" неверно JSON в C#, но "\"2019-01-02\"" есть и все еще дает ту же ошибку.

1 Ответ

1 голос
/ 07 августа 2020

Обнаружил проблему,

Первый "2019-01-02" действителен JSON, но не 2019-01-02, поэтому мне нужен был побег.

После этого мне нужно одно чтение прочтите цитату строки: reader.Read();

Итак, это работает:

using System;
using System.Text;
using System.Text.Json;
Using Xunit;

[Fact]
public void ReadDateTimeTests2()
{
    // Arrange
    var input = "\"2019-01-02\"";

    var dateTimeShortConverter = new DateTimeShortConverter();
    byte[] bytes = Encoding.UTF8.GetBytes(input);
    var reader = new Utf8JsonReader(bytes.AsSpan());
    reader.Read(); // Read the quote

    Type typeToConvert = typeof(DateTime);
    JsonSerializerOptions options = new JsonSerializerOptions();

    var expected = new DateTime(2019, 01, 02);

    // Act
    var result = dateTimeShortConverter.Read(ref reader, typeToConvert, options);

    // Assert
    Assert.Equal(expected, result);
}
...