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那样,可以轻松的进行对象的序列化与反序列化,但到目前为止,尚未找到相对完美的解决方案. 本文旨在抛砖引玉,期待有更好的解决方案:同时向 ...
随机推荐
- 本人常用的Linux bash快捷键(持续更新)
按使用频率由高到低排列: Ctrl + a :移到命令行首Ctrl + e :移到命令行尾 Ctrl + u :从光标处删除至命令行首Ctrl + k :从光标处删除至命令行尾 Ctrl + d :删 ...
- 烂泥:KVM虚拟机随KVM服务器的启动而启动
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 要使KVM虚拟机随KVM服务器的启动而启动,我们所需要做的工作很少.只需要把KVM虚拟机的XML配置文件做一个软连接到/etc/libvirt/qemu ...
- JS键盘事件监听
window.onload=function(){ var keyword = document.getElementById("keyword"); keyword.onkeyu ...
- dev/shm time in linux
统计文件夹大小: du -hx --max=1 : du -sk :du -hsc 重新组织行分隔符进行显示: echo "abc,dd,bach,dong,jing,shang,china ...
- builder.properties
请加上这句话: javacDefaultEncoding.. = UTF-8
- javascript原型Prototype
在javaScript创建对象一文中提到过:用构造函数创建对象存在一个问题即同一构造函数的不同实例的相同方法是不一样的,所以我们用原型把构造函数中公共的属性和方法提取出来进行封装,达到让所有实例共享的 ...
- [转]Oracle如何实现创建数据库、备份数据库及数据导出导入的一条龙操作
本文转自:http://www.cnblogs.com/wuhuacong/archive/2012/03/09/2387680.html Oracle中对数据对象和数据的管理,无疑都是使用PL/SQ ...
- uva 524 prime ring problem——yhx
Prime Ring Problem A ring is composed of n (even number) circles as shown in diagram. Put natural ...
- 【OpenCV】全景拼接
从OpenCV3.0正式版开始,features2d中的一些接口,搬到附加库xfeatures2d中了,其中就有SIFT.SURF的特征检测方法,但是正常下载安装OpenCV并不包含附加库,因为附加库 ...
- codeforces 480B B. Long Jumps(贪心)
题目链接: B. Long Jumps time limit per test 1 second memory limit per test 256 megabytes input standard ...