环境说明

服务端有个接口,返回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 动态序列化属性相关推荐

  1. 转载自——Json.net动态序列化以及对时间格式的处理

    关于我工作中对Json处理的东西 第一:动态序列化类 第二:时间格式处理 通常我们一个类里 可能有十到更多的属性,但是我们序列化通常只需要序列化其中的 三到五个这样的话就会有多余的数据 如果 我只想序 ...

  2. 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)...

    在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...

  3. 使用JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength属性...

    使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错.字符串的长度超过了为 maxJsonLength 属性设置的值. 解决办法是在web.config增加如下节点到& ...

  4. 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)

    在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...

  5. c# 对象json互相转换_C#匿名对象(转JSON)互转、动态添加属性

    public classDynamicClassHelper {/// ///创建属性/// /// /// private static string Propertystring(stringpr ...

  6. 在C#中使用Json.Net进行序列化和反序列化及定制化

    序列化(Serialize)是将对象转换成字节流,并将其用于存储或传输的过程,主要用途是保存对象的状态,以便在需要时重新创建该对象:反序列化(Deserialize)则是将上面的字节流转换为相应对象的 ...

  7. Python抓取网页中的动态序列化数据

    Python抓取网页中的动态序列化数据 动态序列化数据经常应用于前后端分离的页面.或者通过VUE.JS等HTML页面环境,常规的爬虫抓取方法并不能满足数据采集的要求,因此需要其他的方式进行数据的采集. ...

  8. 使用Json.NET来序列化所需的数据

    我们在做开发的时候,很多时候需要和Json数据格式打交道,如Web开发里面,很多时候,数据通过Json进行传递到页面上,然后在进行处理的.而使用Json的时候,我们很多时候会涉及到几个序列化对象的使用 ...

  9. js遍历json数组给html td赋值,JS实现给json数组动态赋值的方法示例

    关注微信公众号 JS实现给json数组动态赋值的方法示例 转载  更新时间:2017年07月04日 10:19:00   作者:小魏的马仔 这篇文章主要介绍了JS实现给json数组动态赋值的方法,结合 ...

最新文章

  1. java ssh文件下载_Java使用SSH从远程服务器下载文件
  2. Android UI开发第十四篇——可以移动的悬浮框
  3. linux中ps命令
  4. 帝国cms与mysql数据库_帝国CMS下在PHP文件中调用数据库类执行SQL语句实例
  5. Linux环境下增加swap交换分区
  6. 如何使用CppUnit进行单元测试
  7. 【MySQL】RPM包安装
  8. 【渝粤教育】广东开放大学 电子商务项目管理 形成性考核 (22)
  9. 原在一个tableView上应用不同类型的DTAttributedTextCell
  10. 使用yum更新补丁包
  11. 2022尚硅谷docker学习笔记
  12. Java 验证码识别(1)使用 Tess4J 进行 OCR 识别
  13. 交换机的Vlan技术 以及Vlan隔离和 端口隔离区别
  14. android 写字板_微软正在Windows 10上的写字板中测试广告
  15. CSS相对定位,固定定位,绝对定位
  16. 几个炫酷且实用的CSS动画效果
  17. 数组的降维与升维方法
  18. 优秀笔记软件盘点—好看、强大的可视化笔记软件、知识图谱工具
  19. Linux下手动安装screen
  20. 利用人性弱电的互联网服务

热门文章

  1. python-----学习资料
  2. 分布式 基本理论 BASE
  3. vue-router判断页面未登录时,自动跳转到登录页
  4. svn服务器的搭建过程 主要为服务端
  5. 怎样检测TCP/UDP端口的连通性
  6. SVN版本管理系统的使用(CentOS+Subversion+Apache+Jsvnadmin+TortoiseSVN)
  7. PX Deq: Execution Msg 等待事件
  8. docker 镜像导入导出
  9. VB6 如何连接MYSQL数据库
  10. python 模块