如何从JsonTextReader读取整个字符串

问题描述

我有一个JsonConverter。我为ReadJson创建了一个单元测试。我的单元测试中有一个错误,指示读取器值为null。如何从阅读器中读取整个字符串?

public class StringConverter<T> : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(T);
    }

    public override object ReadJson(JsonReader reader,Type objectType,object existingValue,JsonSerializer serializer)
    {
        return JsonConvert.DeserializeObject<T>((string)reader.Value);
    }

    public override void WriteJson(JsonWriter writer,object value,JsonSerializer serializer)
    {
        JsonConvert.SerializeObject(value);
    }
}

我的单元测试代码

    private Converter.StringConverter<InstanceSettings> _converter;

    private JsonTextReader CreateJsonReader(string json)
        => new JsonTextReader(new StringReader(json));

    [SetUp]
    public override void Setup()
    {
        base.Setup();
        _converter = new Converter.InstanceSettingsConverter();
    }

   public void StringConverter_ReadJson_InvalidJson_EmptyInstanceSettings()
    {
        // Arrange
        var serializer = new JsonSerializer();
        var json = "{\"property\":{\"search\":true}}";
        var reader = CreateJsonReader(json);

        // Act
        var result = _converter.ReadJson(reader,typeof(InstanceSettings),null,serializer);

        Assert.IsNotNull(result);
        Assert.IsAssignableFrom<InstanceSettings>(result);
    }

我使用转换器将字符串转换为我的类型

    [JsonConverter(typeof(StringConverter<InstanceSettings>))]
    [JsonProperty("settings")]
    public InstanceSettings Settings { get; set; }
    

解决方法

我更换了转换器,并解决了问题

public class InstanceSettingsConverter : JsonConverter<InstanceSettings>
{
    public override InstanceSettings ReadJson(JsonReader reader,Type objectType,InstanceSettings existingValue,bool hasExistingValue,JsonSerializer serializer)
    {
        var json = reader.ValueType == typeof(string) ? reader.Value.ToString() : JRaw.Create(reader).ToString();
        return JsonConvert.DeserializeObject<InstanceSettings>(json);
    }

    public override void WriteJson(JsonWriter writer,InstanceSettings value,JsonSerializer serializer)
    {
        JsonConvert.SerializeObject(value);
    }
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...