首页 新闻 会员 周边 捐助

C# json 序列化 如何去C#其中的一些属性

0
悬赏园豆:20 [已解决问题] 解决于 2014-04-01 11:49

  rt,我想知道C#  或者其扩展库中有没有C# 序列化的帮助类,使得他只序列化我需要的属性,而不是整个类的实例

问题补充:

已解决

/// <summary>
/// 将部分需要的属性值转json
/// </summary>
/// <typeparam name="T">要转化的类</typeparam>
/// <param name="t">要转化的实例</param>
/// <param name="jsonString">要转化的属性值</param>
/// <returns></returns>
public static string JsonSerializerListIgnoredNull<T>(List<T> t,string jsonString)
where T:new()
{
return JsonConvert.SerializeObject(TemporaryClass.GetObjectListUsefulProperties(t, jsonString), Formatting.Indented,
new JsonSerializerSettings {DefaultValueHandling = DefaultValueHandling.Ignore});
}

public static string JsonSerializerListIgnoredNull<T>(T t, string jsonString)
where T : new()
{
return JsonConvert.SerializeObject(TemporaryClass.GetObjectUsefulProperties(t, jsonString), Formatting.Indented,
new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore });
}

 

 


/// <summary>
/// 获取一个类的需要的属性值
/// </summary>
/// <typeparam name="T">要处理的类型</typeparam>
/// <param name="obj"></param>
/// <param name="propertiesStr">使用时用'_'分开需要的属性值的各个属性名</param>
/// <returns></returns>
public static T GetObjectUsefulProperties<T>(T obj, string propertiesStr) where T : new()
{
string[] properties = propertiesStr.Split('_');
T returnObj = new T();

foreach (var propertyName in properties)
{
//将obj中的propertyName这个属性赋值到returnObj上;
returnObj.GetType().GetProperty(propertyName).SetValue(returnObj, obj.GetType().GetProperty(propertyName).GetValue(obj));
}
return returnObj;
}

/// <summary>
/// 获取一个List<类>的需要的各个类属性值
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="objs"></param>
/// <param name="propertiesStr">使用时用'_'分开需要的属性值的各个属性名</param>
/// <returns></returns>
public static List<T> GetObjectListUsefulProperties<T>(List<T> objs, string propertiesStr) where T : new()
{
var returnObjs = new List<T>();
foreach (var obj in objs)
{
returnObjs.Add(GetObjectUsefulProperties(obj, propertiesStr));
}
return returnObjs;
}

阿隐的主页 阿隐 | 初学一级 | 园豆:5
提问于:2014-04-01 09:23
< >
分享
最佳答案
0

你可以new一个匿名类对象.只赋值你想要属性.

或者定义你的类型为可序列化类型.然后指定不序列化的成员.

收获园豆:10
吴瑞祥 | 高人七级 |园豆:29449 | 2014-04-01 09:24

后面一种方法可以麻烦些一个用例么,关于如何定义为可序列话类型和如何指定不序列化

阿隐 | 园豆:5 (初学一级) | 2014-04-01 09:28

@阿隐: 楼下那个连接里面就有代码了.不过我还是推荐使用匿名类.

如果你确定的知道哪些字段要序列化,那你可以再写一个映射类,

吴瑞祥 | 园豆:29449 (高人七级) | 2014-04-01 09:40

@吴瑞祥: 为什么是匿名类,好处在哪?

阿隐 | 园豆:5 (初学一级) | 2014-04-01 09:42

@吴瑞祥: 标志为Ignore 只是一次性标记,下次我可能又要这个属性了,除了这个方法和匿名方法还有其他的方法么。我想抽象出一个接口,然后动态的决定生成的json

阿隐 | 园豆:5 (初学一级) | 2014-04-01 09:47
其他回答(3)
0

http://james.newtonking.com/archive/2009/10/23/efficient-json-with-json-net-reducing-serialized-json-size

这里可能有你需要的答案。

收获园豆:10
喵喵喵猫 | 园豆:1742 (小虾三级) | 2014-04-01 09:35

thx

支持(0) 反对(0) 阿隐 | 园豆:5 (初学一级) | 2014-04-01 09:42
0

帮顶。

seaconch | 园豆:4823 (老鸟四级) | 2014-04-01 09:50
0

看你使用哪个序列化类库,一般都会有[Ignore]特性。

幻天芒 | 园豆:37205 (高人七级) | 2014-04-01 11:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册