惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
Google DeepMind News
Google DeepMind News
V
V2EX
B
Blog RSS Feed
有赞技术团队
有赞技术团队
博客园 - Franky
美团技术团队
月光博客
月光博客
酷 壳 – CoolShell
酷 壳 – CoolShell
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
腾讯CDC
云风的 BLOG
云风的 BLOG
L
LangChain Blog
GbyAI
GbyAI
The Cloudflare Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
C
Check Point Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Stack Overflow Blog
Stack Overflow Blog
博客园 - 【当耐特】
The Register - Security
The Register - Security
大猫的无限游戏
大猫的无限游戏
D
Docker
Vercel News
Vercel News
Blog — PlanetScale
Blog — PlanetScale
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
雷峰网
雷峰网
阮一峰的网络日志
阮一峰的网络日志
P
Proofpoint News Feed
N
Netflix TechBlog - Medium
博客园_首页
A
About on SuperTechFans
J
Java Code Geeks
量子位
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
MongoDB | Blog
MongoDB | Blog
Recent Announcements
Recent Announcements
G
Google Developers Blog
小众软件
小众软件
博客园 - 叶小钗
WordPress大学
WordPress大学
博客园 - 聂微东
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Martin Fowler
Martin Fowler
S
SegmentFault 最新的问题
F
Full Disclosure
Jina AI
Jina AI
H
Help Net Security

博客园 - Zhenway

Azure SignalR支持replication啦 Azure SignalR总览 今天折腾这么一个正则 docfx组件介绍--YamlSerialization docfx daylybuild docfx开源啦 docfx组件介绍--MarkdownLite docfx预热中 合并批量请求 一个简单的Linq to TreeNode 在finally中调用一个需要await的方法 当泛型方法推断,扩展方法遇到泛型类型in/out时。。。 4.5你太黑了,不带这么玩TypeForwardedTo的 一个非常简单的反射加速方案 加载时预防并发执行 又发现一个msdn的坑 又发现个.net framework的坑 sql server死锁神器 踩到一个Emit的坑,留个纪念
定制json序列化
Zhenway · 2018-07-27 · via 博客园 - Zhenway

最近有人问我怎么定制一个json序列化,使序列化的时候只写出声明的父类成员,而不要把实际子类的成员写出来。当然,序列化用的是大家用的最多的json.net。

简单的说,这是个契约怎么解析的问题,json.net选择使用实际类型自然是有多方面的考量,毕竟申明类型可以是抽象类或接口等。废话不说了,直接上代码(仅用于示例,要用于生产的话需要处理各种边缘情况)。

  1. 类型关系

    public class RootObj
    {
        public A A { get; set; }
    }
    
    public class A
    {
        public string X { get; set; }
    }
    
    public class B : A
    {
        public string Y { get; set; }
    }
    
  2. 实例和序列化

    var r = new RootObj { A = new B { X = "x", Y = "y" } };
    Console.WriteLine(JsonConvert.SerializeObject(r));
    

    在什么都不改的情况下,输出是:

    {"A":{"Y":"y","X":"x"}}
    

    而期望值是:

    {"A":{"X":"x"}}
    

    我们期望只输出A的成员。

  3. 写自己的JsonConverter:

    public class JC<T> : JsonConverter
    {
        public override bool CanConvert(Type objectType) => throw new NotImplementedException();
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) => throw new NotImplementedException();
    
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            writer.WriteStartObject();
            var contract = (JsonObjectContract)serializer.ContractResolver.ResolveContract(typeof(T));
            foreach (var prop in contract.Properties)
            {
                writer.WritePropertyName(prop.PropertyName);
                serializer.Serialize(writer, prop.ValueProvider.GetValue(value));
            }
            writer.WriteEndObject();
        }
    }
    
  4. 标记我们的类型

    public class RootObj
    {
        [JsonConverter(typeof(JC<A>))]
        public A A { get; set; }
    }
    
  5. Run! 然后就可以发现结果和我们期待的一样了:)

源代码传输门