Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Json.Net反序列化未知类型时发生意外错误

用Json.Net反序列化未知类型时发生意外错误
EN

Stack Overflow用户
提问于 2017-03-29 13:42:36
回答 1查看 994关注 0票数 1

在下面的代码中,我使用Json.Net序列化一个对象。这个Json嵌入了类型名。然后,我更改其中一个类型名称以导致错误(这是一个测试,我正在处理现有项目中的一个实际问题)。当我反序列化Json时,我希望得到一个对象,该对象对于带有篡改类型名称的属性具有一个空值。相反,序列化程序退出并返回null。我的期望正确吗?我是否可以以某种方式更改设置,以便为根对象获得一个非空对象?请注意,我得到的第二个错误表明序列化程序中存在一个错误。

代码语言:javascript
运行
AI代码解释
复制
static public class JsonTest
{
    static public void Test()
    {
        // Create test object
        A a = new A
        {
            MyTest = new MyTest(),
        };

        // Serialize it. 
        string json = JsonConvert.SerializeObject(a, new JsonSerializerSettings
        {
            TypeNameHandling = TypeNameHandling.Auto
        });

        // Fiddle class name to induce error
        json = json.Replace("+MyTest", "+MyTest2"); 

        // Before: {"MyTest":{"$type":"<Namespace>.JsonTest+MyTest, <Assembly>"}}
        // After: {"MyTest":{"$type":"<Namespace>.JsonTest+MyTest2, <Assembly>"}}

        // Deserialize
        A a2 = JsonConvert.DeserializeObject<A>(json, new JsonSerializerSettings
        {
            TypeNameHandling = TypeNameHandling.Auto,
            Error = (object sender, ErrorEventArgs e) =>
            {
                e.ErrorContext.Handled = true; // Should have only one error: the unrecognized Type
            }
        });

        // A second error occurs: Error = {Newtonsoft.Json.JsonSerializationException: Additional text found in JSON string after finishing deserializing object....
        // a2 is null
    }

    public class A
    {
        public ITest MyTest { get; set; }
    }

    public interface ITest { }
    public class MyTest : ITest { }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-29 20:20:46

更新

问题已在Json.NET 10.0.2 in 本意见书中修复。

原始答案

这看起来是Json.NET中的一个bug。如果我设置了JsonSerializerSettings.MetadataPropertyHandling = MetadataPropertyHandling.ReadAhead,那么问题就消失了:

代码语言:javascript
运行
AI代码解释
复制
// Deserialize
A a2 = JsonConvert.DeserializeObject<A>(json, new JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.Auto,
    MetadataPropertyHandling = MetadataPropertyHandling.ReadAhead,
    Error = (object sender, Newtonsoft.Json.Serialization.ErrorEventArgs e) =>
    {
        Debug.WriteLine(e.ErrorContext.Path);
        e.ErrorContext.Handled = true; // Should have only one error: the unrecognized Type
    }
});

Debug.Assert(a2 != null); // No assert. 

但是,不需要打开此设置,它允许读取元数据属性,包括位于JSON对象中任何位置的"$type",而不仅仅是作为第一个属性。最有可能的是,它巧合地修复了bug,因为它需要在开始反序列化之前预先加载整个JSON对象。

如果你想的话,你可以报告问题

稍微调试一下,问题似乎是,由于无法构造内部MyTest对象,JsonSerializerInternalReader.PopulateObject()在填充外部对象A时捕获和处理异常。正因为如此,JsonReader没有经过内部嵌套的对象,使读取器和序列化程序处于不一致的状态。这说明了第二个异常和最终的Additional text found in JSON string after finishing deserializing object. Path ''异常。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43104683

复制
相关文章
python 调用Google Tran
调用Google 翻译API进行翻译 #!/usr/bin/python #coding: UTF-8 import sys reload(sys) sys.setdefaultencoding('utf8') from xml.etree import ElementTree as ET #引入解析xml文件的模块 import re import urllib,urllib2 #引入接入网络接口API的模块 from socket import error as SocketE
py3study
2020/01/09
1.1K0
博客上如何设置最佳 Google Adsense 广告投放位置
前面我总结了个人的 Google Adsense 投放经验,其中说到最重要的是位置, Google的建议是:博客一般分成两种页面,主页(列表页),日志页,所以可以分别对两种位置就行针对性摆放:
Denis
2023/04/14
9740
博客上如何设置最佳 Google Adsense 广告投放位置
Python3调用Google翻译
想弄一个批量翻译的东西,奈何百度翻译别人根本不研究,所以只能看谷歌翻译的了;这份代码的作者写的太聪明了,是真的很棒,思路很好,看到这样的代码简直年轻10岁
Elapse
2020/08/17
1.5K1
Google Python风格规范(上)
好的代码风格,给人舒服的感觉,今天介绍一下谷歌的Python风格规范,由于规范比较多,将分为两次介绍。
王强
2018/08/09
7090
怎样用Google APIs和Google的应用系统进行集成(3)—-调用Google 发现(Discovery)API的RESTful服务
说了这么多,那么首先同意我以Google Discovery RESTful服务为例,给大家演示怎样用最普通的Java代码调用Google Discovery RESTful服务。
全栈程序员站长
2022/07/12
9490
google code 上源码的下载方法
SVN全称是Subversion,是Apache的一个子项目 ,具体能够到SVN中文站(http://www.subversion.org.cn/)去了解下。Google Code是Google的一个开放源码计划,当中包含源码托管,即提供一个server来保存、共享和管理源码。每一个人都能够创建自己的Project,至于空间的大小,请看下图:
全栈程序员站长
2022/07/09
9650
google code 上源码的下载方法
如何屏蔽博客园中的Google广告
博客园中每篇文章的评论窗口最下面就带了一个Google的广告,当然我这个博客也不例外。不过这些广告我看着就不爽,于是就想办法把该死的广告去掉。使用Mathon2打开博客园中的任何一篇文章,选定Google广告和周围区域,右键“查看选定区域代码”就可以看到原来是Google的JS文件在我的页面中生成了一个Iframe,具体代码为:
深蓝studyzy
2022/06/15
7530
如何用 Google Colab 练 Python?
自动配置、有效求助、协作编程、版本控制。一站式解决 Python 新手练习中的痛点
王树义
2019/03/08
1.9K0
如何将你的Hexo博客部署到Google Firebase上
博主最近在 白嫖万恶的资本 将博客部署到新的CDN上,所以在寻找免费的静态Web应用部署工具,发现了Google Firebase。
pai233
2022/04/26
1.5K0
如何将你的Hexo博客部署到Google Firebase上
google colab上如何下载bert相关模型
https://storage.googleapis.com/bert_models/2018_10_18/cased_L-12_H-768_A-12.zip https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip
西西嘛呦
2021/03/22
2.4K0
Google 的 Firebase 如何删除项目
https://www.ossez.com/t/google-firebase/13792
HoneyMoose
2021/11/02
3.3K0
Google 的 Firebase 如何删除项目
如何关闭google的安全搜索
我们平常使用google搜索,默认是已启用安全搜索的。例如在google搜索“1”,右上角会出现“已启用安全搜索”。 进入google帮助找到安全搜索内容https://support.google.com/websearch/answer/510 屏蔽 Google 上的色情内容 您可以使用安全搜索设置来滤除 Google 上包含露骨内容的搜索结果(例如色情内容)。安全搜索并非 100% 准确,但它能帮您屏蔽掉大多数成人内容。 您可将安全搜索用作一种家长控制方式,以使孩子远离您手机
小歪
2018/04/04
9.2K0
如何关闭google的安全搜索
Google S2 中的 CellID 是如何生成的 ?
笔者在《高效的多维空间点索引算法 — Geohash 和 Google S2》文章中详细的分析了 Google S2 的算法实现思想。文章发出来以后,一部分读者对它的实现产生了好奇。本文算是对上篇文章的补充,将从代码实现的角度来看看 Google S2 的算法具体实现。建议先读完上篇文章里面的算法思想,再看本篇的代码实现会更好理解一些。
一缕殇流化隐半边冰霜
2018/08/30
1.8K0
Google S2 中的 CellID 是如何生成的 ?
Google Colab上的YOLOv3 PyTorch
对于计算机视觉爱好者来说,YOLO(一次只看一次)是一种非常流行的实时对象检测概念,因为它的速度非常快并且性能出色。
代码医生工作室
2020/04/14
2.7K0
Google Colab上的YOLOv3 PyTorch
Openlayers中Google地图的加载
在实现的时候,参考了mygisforum的文章http://blog.csdn.net/mygisforum/article/details/7582449的内容,同时结合gwc的gridset,实现了google切片在Openlayers2中的调用与展示。
牛老师讲GIS
2018/10/23
2K0
Openlayers中Google地图的加载
Google Colab上安装TensorRT
NVIDIA TensorRT是一个高性能深度学习推理平台。它包括深度学习推理优化器和运行时,可为深度学习推理应用程序提供低延迟和高吞吐量。推理时,基于TensorRT的应用程序比仅CPU平台的执行速度快40倍。使用TensorRT,您可以优化所有主流框架中训练出的神经网络模型。
云水木石
2019/07/02
2.4K0
Google Colab上安装TensorRT
点击加载更多

相似问题

复制NSMenuItems最简单的方法是什么?

13

复制列的最简单方法是什么?

10

使用jQuery调整导航菜单大小的最简单方法

31

制作这个垂直菜单最简单的方法是什么?

30

为Android按钮添加箭头的最简单方法是什么

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档