首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在不访问序列化程序的情况下,如何指示Json.NET将接口类型转换为具体类型?

在不访问序列化程序的情况下,如何指示Json.NET将接口类型转换为具体类型?
EN

Stack Overflow用户
提问于 2012-08-31 07:59:01
回答 1查看 2.2K关注 0票数 1

我的问题是,我需要将Newtonsoft.Json.Deserializer反序列化为包含接口类型对象的类型,因此需要指示Json.NET如何转换该接口类型,但不能直接控制JSON。反序列化由框架代码间接处理,即由HttpContent.ReadAsAsync处理。

我如何指定从接口类型到具体类型的转换,而不能直接将转换器添加到JsonSerializer.Converters?如果我在接口定义上使用[JsonConverter]属性,转换器也会被调用来实现接口(即我要转换成的具体类型)。

下面的代码显示了一个C#控制台程序,该程序试图将相同的JSON反序列化为首先是Parent2类,然后是Parent1类,指示Json.NET通过JsonConverterAttributeIChild1接口类型转换为Child1具体类型。对Parent2的反序列化之所以起作用,是因为我将ChildConverter直接添加到serializer.Converters,而反序列化到Parent1会导致堆栈溢出异常,这是因为即使对于Child1类型也会调用ChildConverter.Deserialize

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using System.IO;

namespace TestConsole
{
    [JsonConverter(typeof(ChildConverter))]
    interface IChild1
    {
        string Name { get; set; }
    }

    class Child1 : IChild1
    {
        public string Name { get; set; }
    }

    class Parent1
    {
        public IEnumerable<IChild1> Children { get; set; }
    }

    interface IChild2
    {
        string Name { get; set; }
    }

    class Child2 : IChild2
    {
        public string Name { get; set; }
    }

    class Parent2
    {
        public IEnumerable<IChild2> Children { get; set; }
    }

    class ChildConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return objectType == typeof(IChild1) || objectType == typeof(IChild2);
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (objectType == typeof(IChild1))
                return serializer.Deserialize<Child1>(reader);
            return serializer.Deserialize<Child2>(reader);
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var json = "{'Children': [{'Name': 'Child1'}, {'Name': 'Child2'}]}";

            var serializer = new JsonSerializer();

            serializer.Converters.Add(new ChildConverter());
            var obj = serializer.Deserialize(new StringReader(json), typeof(Parent2));

            serializer = new JsonSerializer();
            obj = serializer.Deserialize(new StringReader(json), typeof(Parent1));
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-31 10:39:04

我找到了一个解决我的特殊问题的方法,那就是调用HttpContent.ReadAsAsync并让它反序列化一个JSON响应。虽然我的解决方案不能解决在不访问序列化程序的情况下配置Json.NET类型转换的一般问题,但它确实解决了我的特定问题。我发现HttpContent.ReadAsync<T>接受一个用于反序列化响应的IEnumerable<MediaTypeFormatter>。这里可以传递一个JsonMediaTypeFormatter,它已经使用您选择的JsonConverter (在我的示例中是ChildConverter)进行了配置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var formatter = new JsonMediaTypeFormatter();
formatter.SerializerSettings.Converters.Add(new ChildConverter());
var obj = await resp.Content.ReadAsAsync<T>(new MediaTypeFormatter[] {formatter});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12211161

复制
相关文章
如何更改Json.NET的序列化规则
我想要使序列化出来的JSON都是小写,可以通过建立 LowercaseContractResolver:DefaultContractResolver
javascript.shop
2019/09/04
1.3K0
[Go]空接口类型断言后 .(指针类型) 和.(具体对象) 的不同区别
拿到以后我们还需要类型断言把类型转换回原始类型 ,空接口可以存储指针变量 , 也可以存储具体类型
唯一Chat
2021/05/10
2K0
[Go]空接口类型断言后 .(指针类型) 和.(具体对象) 的不同区别
Rust Arc指针类型转换:dyn转换为具体类型
在写代码的时候,经常通过dyn关键字+Arc指针来实现多态。但是,有时候会遇到这样一个需求:我们想获取具体类型的Arc指针。比如,结构体A实现了trait Base,想要把Arc<dyn Base>转换为Arc<A>.
灯珑LoGin
2023/10/18
6390
将字符串转换为date类型_java字符串转date类型
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/09
14.2K0
Java将String类型数据转换为Integet类型
今天在写一个java web项目的时候遇到的问题。 由于java中httpservlet传过来的request数据中,所有数据类型都是String的。 但是我们的业务逻辑当中需要的是id的值,是需要Integer类型,所以在接受到数据后需要做一个强制转换。 示例代码如下:
吃猫的鱼Code
2023/02/02
9040
在MVC中使用Json.Net序列化和反序列化Json对象
在.Net的MVC开发中,经常会使用到Json对象,于是,系统提供了JsonResult这个对象,其本质是调用.Net系统自带的Json序列化类JavaScriptSerializer对数据对象进行序列化。但是这个系统自带的Json序列化对象方法没有Json.Net好用,于是打算有些时候用Json.Net替代默认的实现。
深蓝studyzy
2022/06/16
1.2K0
outputstream转byte数组_int类型转换为byte类型
Java中将inputstream输入流转换成byte[]字节数组
全栈程序员站长
2022/11/08
7.8K0
使用WebP Server在不改变URL的情况下将网站图像转换为WebP
WebP Server这是一个基于 Golang 的服务器,允许您动态提供 WebP 图像,在不改变图片URL路径的情况下,自动将JPEG、PNG、BMP、GIF等图像转换为WebP格式,从而减小图片体积,降低流量消耗和提高加载速度。
星哥玩云
2022/08/13
2.2K0
使用WebP Server在不改变URL的情况下将网站图像转换为WebP
将tensor转换为图像_tensor转int
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/07
11.5K0
c++ - 如何自动将强类型枚举转换为int?
a::LOCAL_A是强类型枚举试图实现的功能,但是有一个小的区别:普通枚举可以转换为整数类型,而强类型枚举不能在没有强制转换的情况下实现。
ccf19881030
2021/03/20
6.1K0
Golang接口类型-下篇
在定义变量时将类型指定为接口的函数签名的接口,此时叫匿名接口,匿名接口常用于初始化一次接口变量的场景
仙人技术
2021/11/01
6160
Golang接口类型-上篇
接口是计算机系统中多个组件共享的边界,不同的组件能够在边界上交换信息。接口的本质是引入一个新的中间层,调用方可以通过接口与具体实现分离,解除上下游的耦合,上层的模块不再需要依赖下层的具体模块,只需要依赖一个约定好的接口
仙人技术
2021/10/22
6160
在Python如何将 JSON 转换为 Pandas DataFrame?
在数据处理和分析中,JSON是一种常见的数据格式,而Pandas DataFrame是Python中广泛使用的数据结构。将JSON数据转换为Pandas DataFrame可以方便地进行数据分析和处理。在本文中,我们将探讨如何将JSON转换为Pandas DataFrame,并介绍相关的步骤和案例。
网络技术联盟站
2023/08/03
1.3K0
在Python如何将 JSON 转换为 Pandas DataFrame?
如何将int类型转换为char_int类型转换成char类型
近来面试遇到一个问题,通过控制台输入一个12位的数字,然后进行一些计算,然后被困在如何把char类型的数字转换成int类型。通过搜索,找到两个解决办法。
全栈程序员站长
2022/11/09
2.8K0
[Go]将string转换为io.Reader类型
在使用很多函数的时候需要传入string字符串 , 但是函数参数类型是io.Reader , 这时候就需要将string转换为Reader类型
唯一Chat
2021/02/25
1.9K0
lvds接口类型_LVDS输出
这种接口电路中,采用单路方式传输,每个基色信号采用6位数据,共18位RGB数据,因此,也称18位或18bit LVDS接口。此,也称18位或18bit LVDS接口。
全栈程序员站长
2022/11/17
2K0
lvds接口类型_LVDS输出
java把string转int类型_java把String类型转换为int类型的方法
这篇文章将为大家详细讲解有关java把String类型转换为int类型的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
全栈程序员站长
2022/11/10
4.2K0
java把string转int类型_java把String类型转换为int类型的方法
在公司制度不规范的情况下,如何做好测试工作?
遇到这个好机会你还在等什么?如果说这个公司已经足够好了,那他还请你过来做什么?你的能力还足以让公司有更高的提升么?
软件测试君
2019/11/04
1.2K0
Flink 类型和序列化机制简介 转
Flink 的类型系统源码位于 org.apache.flink.api.common.typeinfo 包,让我们对图 1 深入追踪,看一下类的继承关系图:
stys35
2019/04/09
1.2K0
Flink 类型和序列化机制简介
                                                                            转
如何正确的将数组转换为ArrayList?
对于不可变集合,你可以使用ImmutableList类及其of()与copyOf()工厂方法:(参数不能为空)
崔笑颜
2020/06/08
3.4K0

相似问题

将具体类型的对象反序列化为接口类型

25

将具体实现类型转换为泛型接口类型

111

如何将强制转换接口类型转换为具体类型

21

Automapper -在不创建具体类的情况下映射到接口类型属性

25

属性,当通过接口访问时返回接口类型,通过具体类访问时返回具体类型。

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文