Nib*_*Pig 7 c# json.net json-deserialization
我注意到这个问题在stackoverflow上还有其他一些结果,但它们似乎不起作用或模糊不清.使用最流行的结果,我把这个放在一起:
问题是,当JSON回来并被序列化为我的一个自定义类型时,JSON中的一个有时是一个数组,有时只是一个字符串.如果我的自定义类型有一个字符串,并且JSON是一个数组,我会收到一个错误.反过来也是如此,如果JSON是一个对象而我的自定义类型是一个数组.它只是无法将其映射到属性.
我决定解决这个问题,我想覆盖这个特定属性的反序列化,如果它是一个对象,我想将它转换为一个1对象的数组.
在我序列化的对象中,我添加了一个JsonConverter,我认为它将覆盖它反序列化的方式.
[JsonConverter(typeof(ArrayOrSingleObjectConverter<string>))]
public List<string> person { get; set; }
Run Code Online (Sandbox Code Playgroud)
我们的想法是自定义转换器将单个对象转换为数组.因此,如果JSON为"Hello",则将person设置为包含"Hello"的List,而不是抛出异常,表示无法将字符串转换为List.
如果它已经是一个数组,它应该不管它.
转换器看起来像这样:
public class ArrayOrSingleObjectConverter<T> : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return true; // Not sure about this but technically it can accept an array or an object, so everything is game.
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (objectType == typeof(List<T>))
{
return serializer.Deserialize<List<T>>(reader);
}
else
{
var singleObject = serializer.Deserialize<T>(reader);
var objectAsList = new List<T>();
objectAsList.Add(singleObject);
return objectAsList;
}
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
它不起作用.上面的代码抛出一个异常,试图反序列化一个单独的字符串,说它不能将它转换成if语句中的List('objectype'是一个List).
我很难准确理解读写方法的作用.在stackoverflow的另一个答案中,它建议NotImplementedException在read方法中抛出一个.但是,如果我这样做,则调用read方法并抛出异常.
我想我走在正确的轨道上,但我需要朝着正确的方向努力.我觉得我对ReadJSon方法正在做什么以及它的参数意味着什么有点困惑.
由于我没有在Deserialize方法调用中指定它,我真的不明白它的反序列化的来源.
我对这一点有点不了解.
小智 9
上周我不得不做类似的事情,我想出了以下内容,它适用于List而不是数组
internal class GenericListCreationJsonConverter<T> : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return true;
}
public override bool CanRead
{
get { return true; }
}
public override bool CanWrite
{
get { return false; }
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.StartArray)
{
return serializer.Deserialize<List<T>>(reader);
}
else
{
T t = serializer.Deserialize<T>(reader);
return new List<T>(new[] { t });
}
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3445 次 |
| 最近记录: |