Json.net 动态序列化属性
环境说明
服务端有个接口,返回json格式的数据,要求输出数据的字段由客户端决定。
测试样例
using Newtonsoft.Json;
using System;namespace Hitearth
{class Hitearth{static void Main(string[] args){var demos = new[]{new demo { attr1 = "11", attr2 = "12",attr3 = "13" },new demo { attr1 = "21", attr2 = "22",attr3 = "23" },};var demo2 = new demo();demo2.obj = demo2;var demo3 = new demo { attr2 = "demo3" };demo3.obj = new demo { attr2 = "demo3.obj", obj = new demo { attr2 = "demo3.obj.obj" } };Console.WriteLine(JsonConvert.SerializeObject(demos)); // [{"attr1":"11","attr2":"12","attr3":"13","obj":null},{"attr1":"21","attr2":"22","attr3":"23","obj":null}]test(demos, "attr1 attr2".Split(' ')); // [{"attr1":"11","attr2":"12"},{"attr1":"21","attr2":"22"}]test(demos, "attr2 attr3".Split(' ')); // [{"attr2":"12","attr3":"13"},{"attr2":"22","attr3":"23"}]test(demos, new string[] { }); // [{},{}]test(demo2, "attr2 attr3".Split(' ')); // {"attr2":null,"attr3":null}test(demo2, "attr2 obj".Split(' ')); // Self referencing loop detected with type 'Hitearth.demo'.Path ''.test(demo3, "attr2 obj".Split(' '));// {"attr2":"demo3","obj":{"attr2":"demo3.obj","obj":{"attr2":"demo3.obj.obj","obj":null}}}}static void test(object obj, string[] attrs){try{Console.WriteLine(JsonConvert.SerializeObject(obj, new FilterPropertiesJsonConverter(typeof(demo), attrs)));}catch (Exception ex){Console.WriteLine(ex.Message);}}}public class demo{public string attr1 { get; set; }public string attr2 { get; set; }public string attr3 { get; set; }public demo obj { get; set; }}}
using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System; using System.Linq;namespace Hitearth {/// <summary>/// 只序列化 jsonProperties 指定的字段/// </summary>/// <typeparam name="T"></typeparam>public class FilterPropertiesJsonConverter : JsonConverter{Type type; string[] jsonProperties; bool reversed = false;public FilterPropertiesJsonConverter(Type type, string[] jsonProperties, bool reversed = false){if (type == null) throw new ArgumentNullException("type");if (jsonProperties == null) throw new ArgumentNullException("jsonProperties");this.type = type;this.jsonProperties = jsonProperties;this.reversed = reversed;}public override bool CanConvert(Type objectType){return objectType == type;}public override bool CanRead { get { return false; } }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){if (value == null){writer.WriteNull();return;}var contract = serializer.ContractResolver.ResolveContract(value.GetType()) as JsonObjectContract;writer.WriteStartObject();if (contract != null){foreach (var item in contract.Properties){if (jsonProperties.Contains(item.PropertyName) == reversed)continue;writer.WritePropertyName(item.PropertyName);serializer.Serialize(writer, item.ValueProvider.GetValue(value));}}writer.WriteEndObject();}} }
转载于:https://www.cnblogs.com/hitearth/p/10323186.html
Json.net 动态序列化属性相关推荐
- 转载自——Json.net动态序列化以及对时间格式的处理
关于我工作中对Json处理的东西 第一:动态序列化类 第二:时间格式处理 通常我们一个类里 可能有十到更多的属性,但是我们序列化通常只需要序列化其中的 三到五个这样的话就会有多余的数据 如果 我只想序 ...
- 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)...
在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...
- 使用JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength属性...
使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错.字符串的长度超过了为 maxJsonLength 属性设置的值. 解决办法是在web.config增加如下节点到& ...
- 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)
在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...
- c# 对象json互相转换_C#匿名对象(转JSON)互转、动态添加属性
public classDynamicClassHelper {/// ///创建属性/// /// /// private static string Propertystring(stringpr ...
- 在C#中使用Json.Net进行序列化和反序列化及定制化
序列化(Serialize)是将对象转换成字节流,并将其用于存储或传输的过程,主要用途是保存对象的状态,以便在需要时重新创建该对象:反序列化(Deserialize)则是将上面的字节流转换为相应对象的 ...
- Python抓取网页中的动态序列化数据
Python抓取网页中的动态序列化数据 动态序列化数据经常应用于前后端分离的页面.或者通过VUE.JS等HTML页面环境,常规的爬虫抓取方法并不能满足数据采集的要求,因此需要其他的方式进行数据的采集. ...
- 使用Json.NET来序列化所需的数据
我们在做开发的时候,很多时候需要和Json数据格式打交道,如Web开发里面,很多时候,数据通过Json进行传递到页面上,然后在进行处理的.而使用Json的时候,我们很多时候会涉及到几个序列化对象的使用 ...
- js遍历json数组给html td赋值,JS实现给json数组动态赋值的方法示例
关注微信公众号 JS实现给json数组动态赋值的方法示例 转载 更新时间:2017年07月04日 10:19:00 作者:小魏的马仔 这篇文章主要介绍了JS实现给json数组动态赋值的方法,结合 ...
最新文章
- java ssh文件下载_Java使用SSH从远程服务器下载文件
- Android UI开发第十四篇——可以移动的悬浮框
- linux中ps命令
- 帝国cms与mysql数据库_帝国CMS下在PHP文件中调用数据库类执行SQL语句实例
- Linux环境下增加swap交换分区
- 如何使用CppUnit进行单元测试
- 【MySQL】RPM包安装
- 【渝粤教育】广东开放大学 电子商务项目管理 形成性考核 (22)
- 原在一个tableView上应用不同类型的DTAttributedTextCell
- 使用yum更新补丁包
- 2022尚硅谷docker学习笔记
- Java 验证码识别(1)使用 Tess4J 进行 OCR 识别
- 交换机的Vlan技术 以及Vlan隔离和 端口隔离区别
- android 写字板_微软正在Windows 10上的写字板中测试广告
- CSS相对定位,固定定位,绝对定位
- 几个炫酷且实用的CSS动画效果
- 数组的降维与升维方法
- 优秀笔记软件盘点—好看、强大的可视化笔记软件、知识图谱工具
- Linux下手动安装screen
- 利用人性弱电的互联网服务