C#Json序列化和反序列化
1、动态决定数据是否要序列化
我的需求是这样的,我用了一款数据库的组件叫Dos.ORM,确实方便了不少,但是在用的时候,我发现一个问题,比如我定义的表中有一个字段添加时间,修改时间,这些都是默认的,在添加的时候,不需要赋值,但是我从前端传过来,就会是一个DateTime.MinValue。我不希望去更改它。但是我从数据库里面查询字段的时候,我又希望获取这些数据。所以不能简单的在Model上面加上是否序列化的属性。
下面是我的JsonHelper类
using Help.DataService.Business.Common;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Help.DataService.Business
{
public static class JsonHelper
{
public static string SerializeObject(object param)
{
if (param != null)
{
return JsonConvert.SerializeObject(param);
} return string.Empty;
} public static T DeserializeObject<T>(string json) where T : class
{
if (!string.IsNullOrEmpty(json))
{
return JsonConvert.DeserializeObject<T>(json);
} return default(T);
} public static RESULT ParseModel<INPUT, RESULT>(INPUT data)
where INPUT : class
where RESULT : class
{
if (data == null)
{
return null;
} var jSetting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore };
string[] props = { "ModifyTime", "AddTime" };
jSetting.ContractResolver = new LimitPropsContractResolver(props, false); string json = JsonConvert.SerializeObject(data, jSetting); if (!string.IsNullOrEmpty(json))
{
// 空值和默认值,就不需要反序列化,Dos.ORM组件里面如果DateTime为0001-01-01的话,操作数据库会不成功
return JsonConvert.DeserializeObject<RESULT>(json, jSetting);
} return default(RESULT);
} public static R ParseViewModel<I, R>(I data)
where I : class
where R : class
{
string json = SerializeObject(data);
return DeserializeObject<R>(json);
}
}
}
LimitPropsContractResolver类的代码如下:
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Help.DataService.Business.Common
{
/// <summary>
/// 动态决定属性是否序列化
/// </summary>
public class LimitPropsContractResolver : DefaultContractResolver
{
/// <summary>
/// 属性列表
/// </summary>
private string[] props = null; /// <summary>
/// 是否包含
/// </summary>
private bool retain; /// <summary>
/// 构造函数
/// </summary>
/// <param name="props">props</param>
/// <param name="isretain">isretain(包含还是排除)</param>
public LimitPropsContractResolver(string[] props, bool isretain = true)
{
this.props = props;
this.retain = isretain;
} protected override IList<JsonProperty> CreateProperties(Type type, Newtonsoft.Json.MemberSerialization memberSerialization)
{
IList<JsonProperty> list = base.CreateProperties(type, memberSerialization); if (props == null || props.Length == )
{
return list;
} // 只列出清单保留的属性
var ret = list.Where(p =>
{
if (retain)
{
return this.props.Contains(p.PropertyName);
}
else
{
return !this.props.Contains(p.PropertyName);
}
}).ToList(); return ret;
}
}
}
2、用C#调java的服务。
结果报错为数据没有查到,想不通,后来调试java代码发现,又是反序列化问题。因为C#的代码是第一个字母大写,java代码是第一个字母小写,这样就导致反序列化之后,java完全没有获取到任何参数,虽然C#已经传递过去了。在不改变java代码的前提下,我只能改C#代码了。好在有现成的方法,不过不是很常用,如下:
CamelCasePropertyNamesContractResolver cal = new CamelCasePropertyNamesContractResolver();
JsonSerializerSettings setting = new JsonSerializerSettings();
setting.ContractResolver = cal;
string json = JsonConvert.SerializeObject(vo, setting);
3、相关资料
C#Json序列化和反序列化的更多相关文章
- DotNet的JSON序列化与反序列化
JSON(JavaScript Object Notation)JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.在现在的通信中,较多的采用JSON数据格式,JSON有 ...
- C#中JSON序列化和反序列化
有一段时间没有到博客园写技术博客了,不过每天逛逛博客园中大牛的博客还是有的,学无止境…… 最近在写些调用他人接口的程序,用到了大量的JSON.XML序列化和反序列化,今天就来总结下json的序列化和反 ...
- Newtonsoft.Json 序列化和反序列化 时间格式
From : http://www.cnblogs.com/litian/p/3870975.html 1.JSON序列化 string JsonStr= JsonConvert.SerializeO ...
- Net中JSON序列化和反序列化处理(日期时间特殊处理)
0 缘由 笔者最近在web api端使用Json.Net进行序列化处理,而在调用端使用DataContractSerializer进行反序列化,遇到日期时间处理反序列化不成功[备注:笔者使用Net ...
- Newtonsoft.Json 序列化和反序列化 时间格式 [转]
1.JSON序列化 string JsonStr= JsonConvert.SerializeObject(Entity); eg: A a=new A(); a.Name="Elain ...
- C# JSON 序列化和反序列化——JavaScriptSerializer实现
一. JavaScriptSerializer 类由异步通信层内部使用,用于序列化和反序列化在浏览器和 Web 服务器之间传递的数据.您无法访问序列化程序的此实例.但是,此类公开了公共 API.因此, ...
- 序列化对象C++对象的JSON序列化与反序列化探索
新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正 一:背景 作为一名C++开发人员,我始终很期待能够像C#与JAVA那样,可以省力的进行对象的序列化与反序列化,但到现在为止,还没有找 ...
- C++对象的JSON序列化与反序列化探索完结-列表的序列化与反序列化
在前两篇文章中,我们已经完成对普通对象以及复杂对象嵌套的序列化与反序列化,见如下地址: C++对象的JSON序列化与反序列化探索 C++对象的JSON序列化与反序列化探索续-复杂对象的序列化与反序列化 ...
- C++对象的JSON序列化与反序列化探索续-复杂对象的序列化与反序列化
本文是基本上一篇博文进行改进而成,上一篇请见: C++对象的JSON序列化与反序列化探索 此处就不多说了,直接上代码. 1. 序列化基类 #pragma once #include <strin ...
- C++对象的JSON序列化与反序列化探索
一:背景 作为一名C++开发人员,我一直很期待能够像C#与JAVA那样,可以轻松的进行对象的序列化与反序列化,但到目前为止,尚未找到相对完美的解决方案. 本文旨在抛砖引玉,期待有更好的解决方案:同时向 ...
随机推荐
- Profiling MySQL queries from Performance Schema
转自:http://www.percona.com/blog/2015/04/16/profiling-mysql-queries-from-performance-schema/ When opti ...
- mongodb--java操作
一.mongodb客户端 mongodb提供诸多语言的客户端,也包括java的客户端.通过这些客户端,我们可以很方便地使用编写代码的方式对mongodb进行操作.这里使用java客户端进行示例.使用j ...
- Linux SELinux命令
getsebool与setsebool工具 说明:SELinux规范了许多boolean数值清单档案,提供开启或关闭功能存取项目,而这些值都存放在/selinux/booleans/目录内相关档案,这 ...
- CS193P学习笔记(一)
1>iOS系统分层 1.Core OS 核心操作系统层,很接近硬件的一层: 本质是一个Unix内核,使用基于BSD的Unix版本,拥有文件系统.套接字.权限等一系列Unix所具有的特性,并且 ...
- MBean的学习
参考:http://tuhaitao.iteye.com/blog/786391 这里以MBean对象进行演示向服务器注册,调用的过程. 1.MBean接口,接口名必须以MBean结尾 package ...
- 深度优先搜索 codevs 1064 虫食算
codevs 1064 虫食算 2004年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 所 ...
- codeforces 484B B. Maximum Value(二分)
题目链接: B. Maximum Value time limit per test 1 second memory limit per test 256 megabytes input standa ...
- HDU 5029 Relief grain --树链剖分第一题
题意:给一棵树,每次给两个节点间的所有节点发放第k种东西,问最后每个节点拿到的最多的东西是哪种. 解法:解决树的路径上的修改查询问题一般用到的是树链剖分+线段树,以前不会写,后来学了一下树链剖分,感觉 ...
- 【转】Python中string的strip,lstrip,rstrip用法
Python中的strip用于去除字符串的首尾字符串,同理,lstrip用于去除左边的字符,rstrip用于去除右边的字符. 这三个函数都可传入一个参数,指定要去除的首尾字符. 需要注意的是,传入的是 ...
- HDU 1394 & ZOJ 1484 Minimum Inversion Number
(更新点查询区间) 这题重在想到,写代码很容易了..这题是利用线段树求逆序数,不按给定的顺序建树,而是有序地插入.比如每插入一个数,就统计之前插入的那些数里比他大的有多少个,这个数就是此时的逆序数,然 ...