问题描述
我有一个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);
}
}