C# Utf8JsonReader.ToString提供:无法获取令牌类型“None”的值

C# Utf8JsonReader.ToString提供:无法获取令牌类型“None”的值,c#,json,.net-core,system.text.json,C#,Json,.net Core,System.text.json,请注意,这是针对System.Text.Json的,而不是针对Json.Net的,因此不是重复的 我喜欢对自定义JsonConverter进行单元测试: 使用System.Text.Json; 公共类DateTimeShortConverter:JsonConverter { 公共覆盖DateTime Readref Utf8JsonReader读取器,键入typeToConvert,JsonSerializerOptions选项 { //支持yyyy MM dd,但也支持时间 return D

请注意,这是针对System.Text.Json的,而不是针对Json.Net的,因此不是重复的

我喜欢对自定义JsonConverter进行单元测试:

使用System.Text.Json; 公共类DateTimeShortConverter:JsonConverter { 公共覆盖DateTime Readref Utf8JsonReader读取器,键入typeToConvert,JsonSerializerOptions选项 { //支持yyyy MM dd,但也支持时间 return DateTime.Parsereader.GetString; } public override void WriteUtf8JsonWriter writer、日期时间值、JsonSerializerOptions选项 { writer.WriteStringValuevalue.ToStringyyyy-MM-dd; } 我需要一个Utf8JsonReader,我需要给它一个字符串

我试过这个:

byte[] bytes = Encoding.UTF8.GetBytes("2019-01-02");
var reader = new Utf8JsonReader(bytes.AsSpan());
这似乎可以工作,但在执行reader.GetString时会导致转换器崩溃:

System.InvalidOperationException:无法将令牌类型“None”的值作为字符串获取。 位于System.Text.Json.Utf8JsonReader.GetString

GetString应该是正确的,所以我想我给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);
}

更新:这也不能回答我的问题:。我也尝试了这个答案,但运气不好:

byte[] bytes = Encoding.UTF8.GetBytes(input);
var reader = new Utf8JsonReader(bytes.AsSpan(), false, new JsonReaderState(new JsonReaderOptions()));
使现代化 2019-01-02在C中不是正确的JSON,但是\2019-01-02\是正确的,并且仍然给出相同的错误。

发现了问题

第一个2019-01-02是有效的JSON,但不是2019-01-02,所以我需要在那里转义

之后,我需要一个read来读取字符串的引号: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);
}

我可能误解了这一点,但您的输入不是json?是的,确实也尝试了\2019-01-02\;但这只会失败\2019-01-02\也不是json。json必须类似于{propName:2019-01-02}2019-01-02是有效的JSON:请参阅。我需要一个阅读器。请阅读;另外,请参阅我的回答您将如何在本测试中捕获异常?@User9193请参阅此链接!谢谢链接。