将一个对象反序列化为另一种类型的类似对象json.net
我有一个与类似的问题,但仍然会出错 所以,我有三个班:将一个对象反序列化为另一种类型的类似对象json.net,json,types,deserialization,Json,Types,Deserialization,我有一个与类似的问题,但仍然会出错 所以,我有三个班: public class Class1 { public string[] P2 { get; set; } } public class Class2 { public Wrapper<string>[] P2 { get; set; } } public class Wrapper<T> { public T Value { get; set; } } 谢谢, 亚历克斯我自己设法找到
public class Class1
{
public string[] P2 { get; set; }
}
public class Class2
{
public Wrapper<string>[] P2 { get; set; }
}
public class Wrapper<T>
{
public T Value { get; set; }
}
谢谢,
亚历克斯我自己设法找到了答案。以下是方法:
Class2 c2 = new Class2
{
P2 = new Wrapper<string>[]
{
new Wrapper<string> { Value = "a" },
new Wrapper<string> { Value = "a" },
},
};
string s = JsonConvert.SerializeObject(c2);
Class1 c1 = (Class1)JsonConvert.DeserializeObject(s, typeof(Class1), new FormatConverter());
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (type == typeof(string[]) && reader.TokenType == JsonToken.StartArray)
{
//remove converter not to trigger a recursive call
var converter = serializer.Converters[0];
serializer.Converters.RemoveAt(0);
//deserialization into correct type
Wrapper<string>[] obj = (Wrapper<string>[])serializer.Deserialize(reader, typeof(Wrapper<string>[]));
//restore converter
serializer.Converters.Add(converter);
if (obj != null)
{
return obj.Select(w => w == null ? null : w.Value).ToArray();
}
return reader.Value;
}
}
public override object ReadJson(JsonReader reader,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
if(type==typeof(string[])&&reader.TokenType==JsonToken.StartArray)
{
//移除转换器以不触发递归调用
var converter=序列化程序。转换器[0];
序列化程序.Converters.RemoveAt(0);
//反序列化为正确的类型
包装器[]对象=(包装器[])序列化程序。反序列化(读取器,类型化(包装器[]));
//还原转换器
serializer.Converters.Add(转换器);
如果(obj!=null)
{
返回obj.Select(w=>w==null?null:w.Value).ToArray();
}
返回reader.Value;
}
}
un我注意到的更多事情是,反序列化对象
失败,即使在ReadJson
中,我只返回一个数组,如下所示:返回新字符串[1]{“a”}代码>
An unhandled exception of type 'Newtonsoft.Json.JsonSerializationException' occurred in Newtonsoft.Json.dll
Additional information: Unexpected end when deserializing object. Path '', line 1, position 46.
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (type == typeof(string[]) && reader.TokenType == JsonToken.StartArray)
{
//remove converter not to trigger a recursive call
var converter = serializer.Converters[0];
serializer.Converters.RemoveAt(0);
//deserialization into correct type
Wrapper<string>[] obj = (Wrapper<string>[])serializer.Deserialize(reader, typeof(Wrapper<string>[]));
//restore converter
serializer.Converters.Add(converter);
if (obj != null)
{
return obj.Select(w => w == null ? null : w.Value).ToArray();
}
return reader.Value;
}
}