c# – JSON.NET,如果预期的对象无法反序列化,则实例化回退对象
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – JSON.NET,如果预期的对象无法反序列化,则实例化回退对象,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2173字,纯文字阅读大概需要4分钟。
内容图文
![c# – JSON.NET,如果预期的对象无法反序列化,则实例化回退对象](/upload/InfoBanner/zyjiaocheng/773/24cb7c7141c84c64b8a9e97c338cebe3.jpg)
我有一个项目树,我正在尝试使用JSON.NET反序列化.有些情况(例如重命名节点类型)可能会导致树上的节点无法反序列化.
在这些情况下,我想插入一个节点的默认实例(可能是其他类型)来代替未反序列化的对象.
这样,我的用户仍然可以加载他们的保存文件,获得他们必须修复的“空”节点……但是,至少他们仍然可以加载他们的文件!
我一直在做一些研究,并且有一些事情要尝试使用SerializationBinder和/或在序列化程序的回调中破解一些错误处理,但我觉得有点问,如果有一些明显的解决方案我缺少,或输入有关这些方法.
如果它很重要,这是一个快速发展的内部工具,我们偶尔会想到一些破碎的树木,我们真的希望它们会加载,无论如何:)
谢谢!
解决方法:
我想出了一些东西,非常感谢这里的其他几十个帖子!
用JsonConverter修饰的节点基类
[JsonObject( IsReference = true, TypeNameHandling = TypeNameHandling.All )]
[JsonConverter( typeof( ChainNodeConverter ))]
public abstract class Node
{
public List< Node > Children { get; set; }
}
ErrorNode类具有一些属性来帮助id /恢复失败的节点
public class ErrorNode : Node
{
public JToken JToken { get; set; }
public string FailedTypeString { get; set; }
}
NodeConverer类
public class NodeConverter : JsonConverter
{
public override bool CanRead { get { return true; } }
public override bool CanWrite { get { return false; } }
public override bool CanConvert( Type objectType ) { return typeof( Node ).IsAssignableFrom( objectType ); }
public override void WriteJson( JsonWriter writer, object value, JsonSerializer serializer )
{
throw new NotImplementedException("If CanWrite is false; this won't be called.");
}
public override object ReadJson( JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer )
{
var jToken = JToken.ReadFrom( reader );
var refString = jToken.Value< string >( "$ref" );
var firstReference = refString == null;
if ( firstReference )
{
var typeString = jToken.Value<string>( "$type" );
if ( typeString != null )
{
var type = Type.GetType( typeString );
if ( type == null )
{
var errorNode = new ErrorNode();
errorNode.JToken = jToken;
errorNode.FailedTypeString = typeString;
// Apply the old node's relationships to errorNode
serializer.Populate( jToken.CreateReader(), errorNode );
return errorNode;
}
}
}
// Default-like behaviour
return serializer.Deserialize( jToken.CreateReader() );
}
}
内容总结
以上是互联网集市为您收集整理的c# – JSON.NET,如果预期的对象无法反序列化,则实例化回退对象全部内容,希望文章能够帮你解决c# – JSON.NET,如果预期的对象无法反序列化,则实例化回退对象所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。