• 主页
  • ASP
  • .NET Framework
  • Web Services
  • VB
  • VC
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • LINQ

C#.NET下转换泛型列表为JSON格式,需求过滤功能

潮起潮落 2011-12-01 03:48:00
就是说一个泛型列表list,我要把他序列化为JSON格式字符串输出到客户端
但是需求有一个过滤功能,list中的对象满足Obj.ID > 300 才序列化,否则略过。

JSON.NET/其他组件或者.NET自带的序列化类有没有能实现这个功能的?

问1个小时,无答案就自己造个有局限性的先用……
...全文
462 点赞 收藏 12
写回复
12 条回复
net075 2013年05月16日
/// <summary> /// 泛型集合转json /// </summary> /// <typeparam name="T">< peparam> /// <param name="jsonName"></param> /// <param name="IL"></param> /// <returns></returns> public static string ObjectToJson(string jsonName, IList<InspectionDetails> IL) { StringBuilder Json = new StringBuilder(); if (jsonName.Equals("")) { Json.Append("["); } else { Json.Append("{\"" + jsonName + "\":["); } if (IL.Count > 0) { foreach (InspectionDetails item in IL) { Json.Append('{'); Json.AppendFormat("\"InspectionType\":{0},\"TestMethod\":\"{1}\",\"TestParts\":\"{2}\",\"TestRatio\":\"{3}\"", (int)item.InspectionType, item.TestMethod.Code, item.TestParts, item.TestRatio.ToString()); Json.Append("},"); } } if (jsonName.Equals("")) { return Json.ToString().Trim(',') + "]"; } else { return Json.ToString().Trim(',') + "]}"; } }
回复 点赞
潮起潮落 2011年12月01日
[Quote=引用 9 楼 charles_y 的回复:]

引用 7 楼 konghulu 的回复:

引用 6 楼 charles_y 的回复:

什么意思,没看懂

先过滤一遍,再把过滤后的转化成json 不就行了。

过滤条件 list.Where(o=>o.ID>300).ToList()

问题是这个实体是这样的

public class Mock()
{
public int ID{get;set;}
pub……
[/Quote]
只向下继承
上层的失效,就不管他这一溜呢。
开始想的是写一个通用的带这种过滤功能的转换器,或者深拷贝(就不会出现污染的情况)。
但是精力有限,现在写了个针对特定对象的递归转换=。=先用了。
回复 点赞
charles_y 2011年12月01日
[Quote=引用 7 楼 konghulu 的回复:]

引用 6 楼 charles_y 的回复:

什么意思,没看懂

先过滤一遍,再把过滤后的转化成json 不就行了。

过滤条件 list.Where(o=>o.ID>300).ToList()

问题是这个实体是这样的

public class Mock()
{
public int ID{get;set;}
public List<Mock> chi……
[/Quote]

这样的话,List可以有很多层,是不是要筛选出 list 中的mock满足条件,child中的mock同时必要也全都满足条件,同时child的child中的mock也全部都要满足条件...的啊
回复 点赞
潮起潮落 2011年12月01日
[Quote=引用 6 楼 charles_y 的回复:]

什么意思,没看懂

先过滤一遍,再把过滤后的转化成json 不就行了。

过滤条件 list.Where(o=>o.ID>300).ToList()
[/Quote]
另外
List<Mock> list = new ....
保存在缓存是全局用的,要在筛选完毕后并不污染原对象。
回复 点赞
潮起潮落 2011年12月01日
[Quote=引用 6 楼 charles_y 的回复:]

什么意思,没看懂

先过滤一遍,再把过滤后的转化成json 不就行了。

过滤条件 list.Where(o=>o.ID>300).ToList()
[/Quote]
问题是这个实体是这样的

public class Mock()
{
public int ID{get;set;}
public List<Mock> childList{get;set;}
}

List<Mock> list = new ....

筛选list的时候还要同时筛选他的childList这个属性
回复 点赞
charles_y 2011年12月01日
什么意思,没看懂

先过滤一遍,再把过滤后的转化成json 不就行了。

过滤条件 list.Where(o=>o.ID>300).ToList()
回复 点赞
潮起潮落 2011年12月01日
[Quote=引用 1 楼 hanqing_liu 的回复:]

using System.Web.Script.Serialization;

var data = from t in its.ToList()
select new
{};

StringBuilder buider = new StringBuilder();
J……
[/Quote]
泛型列表中的对象还有一个属性是泛型列表,同样是要按条件过滤。
LINQ也在考虑范围内,还没有试,不知是否会有污染原对象的情况出现。
回复 点赞
潮起潮落 2011年12月01日
[Quote=引用 3 楼 dinglang_2009 的回复:]

源代码给你了,自己在上面加上判断,不就搞定了吗?
[/Quote]

public static string ListTToJson<T>(List<T> List)
{
StringBuilder JSON = new StringBuilder();
JSON.Append("[");
if (List.Count > 0)
{
//反射取得类型的属性等信息
T obj = Activator.CreateInstance<T>();
Type type = obj.GetType();
PropertyInfo[] pis = type.GetProperties();
for (int i = 0; i < List.Count; i++)
{
//进行条目的组装
JSON.Append("{");
for (int j = 0; j < pis.Length; j++)
{
JSON.Append("\"" + pis[j].Name.ToString() + "\":\"" + pis[j].GetValue(List[i], null) + "\"");
if (j < pis.Length - 1)
{
//在非最后一个属性后面加上半角逗号,符合JSON标准格式
JSON.Append(",");
}
}
JSON.Append("}");
if (i < List.Count - 1)
{
//在非最后一个条目后加上半角逗号
JSON.Append(",");
}
}
}
JSON.Append("]");
return JSON.ToString();
}
回复 点赞
丁码农 2011年12月01日
源代码给你了,自己在上面加上判断,不就搞定了吗?
回复 点赞
丁码农 2011年12月01日

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;
using System.Data;
using System.Data.Common;
using System.Collections;
using System.Reflection;

namespace LearningAspNet.JSON示例
{
public class jsonCovert
{
/// <summary>
/// List转成json
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="jsonName"></param>
/// <param name="list"></param>
/// <returns></returns>
public string ListToJson<T>(IList<T> list, string jsonName)
{
StringBuilder Json = new StringBuilder();
if (string.IsNullOrEmpty(jsonName))
jsonName = list[0].GetType().Name;
Json.Append("{\"" + jsonName + "\":[");
if (list.Count > 0)
{
for (int i = 0; i < list.Count; i++)
{
T obj = Activator.CreateInstance<T>();
PropertyInfo[] pi = obj.GetType().GetProperties();
Json.Append("{");
for (int j = 0; j < pi.Length; j++)
{
Type type = pi[j].GetValue(list[i], null).GetType();
Json.Append("\"" + pi[j].Name.ToString() + "\":" + StringFormat(pi[j].GetValue(list[i], null).ToString(), type));

if (j < pi.Length - 1)
{
Json.Append(",");
}
}
Json.Append("}");
if (i < list.Count - 1)
{
Json.Append(",");
}
}
}
Json.Append("]}");
return Json.ToString();
}

/// <summary>
/// List转成json
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
/// <returns></returns>
public string ListToJson<T>(IList<T> list)
{
object obj = list[0];
return ListToJson<T>(list, obj.GetType().Name);
}

/// <summary>
/// 对象转换为Json字符串
/// </summary>
/// <param name="jsonObject">对象</param>
/// <returns>Json字符串</returns>
public string ToJson(object jsonObject)
{
string jsonString = "{";
PropertyInfo[] propertyInfo = jsonObject.GetType().GetProperties();
for (int i = 0; i < propertyInfo.Length; i++)
{
object objectValue = propertyInfo[i].GetGetMethod().Invoke(jsonObject, null);
string value = string.Empty;
if (objectValue is DateTime || objectValue is Guid || objectValue is TimeSpan)
{
value = "'" + objectValue.ToString() + "'";
}
else if (objectValue is string)
{
value = "'" + ToJson(objectValue.ToString()) + "'";
}
else if (objectValue is IEnumerable)
{
value = ToJson((IEnumerable)objectValue);
}
else
{
value = ToJson(objectValue.ToString());
}
jsonString += "\"" + ToJson(propertyInfo[i].Name) + "\":" + value + ",";
}
jsonString.Remove(jsonString.Length - 1, jsonString.Length);
return jsonString + "}";
}

/// <summary>
/// 对象集合转换Json
/// </summary>
/// <param name="array">集合对象</param>
/// <returns>Json字符串</returns>
public string ToJson(IEnumerable array)
{
string jsonString = "[";
foreach (object item in array)
{
jsonString += ToJson(item) + ",";
}
jsonString.Remove(jsonString.Length - 1, jsonString.Length);
return jsonString + "]";
}

/// <summary>
/// 普通集合转换Json
/// </summary>
/// <param name="array">集合对象</param>
/// <returns>Json字符串</returns>
public string ToArrayString(IEnumerable array)
{
string jsonString = "[";
foreach (object item in array)
{
jsonString = ToJson(item.ToString()) + ",";
}
jsonString.Remove(jsonString.Length - 1, jsonString.Length);
return jsonString + "]";
}

/// <summary>
/// Datatable转换为Json
/// </summary>
/// <param name="table">Datatable对象</param>
/// <returns>Json字符串</returns>
public string ToJson(DataTable dt)
{
StringBuilder jsonString = new StringBuilder();
jsonString.Append("[");
DataRowCollection drc = dt.Rows;
for (int i = 0; i < drc.Count; i++)
{
jsonString.Append("{");
for (int j = 0; j < dt.Columns.Count; j++)
{
string strKey = dt.Columns[j].ColumnName;
string strValue = drc[i][j].ToString();
Type type = dt.Columns[j].DataType;
jsonString.Append("\"" + strKey + "\":");
strValue = StringFormat(strValue, type);
if (j < dt.Columns.Count - 1)
{
jsonString.Append(strValue + ",");
}
else
{
jsonString.Append(strValue);
}
}
jsonString.Append("},");
}
jsonString.Remove(jsonString.Length - 1, 1);
jsonString.Append("]");
return jsonString.ToString();
}

/// <summary>
/// DataTable转成Json
/// </summary>
/// <param name="jsonName"></param>
/// <param name="dt"></param>
/// <returns></returns>
public string ToJson(DataTable dt, string jsonName)
{
StringBuilder Json = new StringBuilder();
if (string.IsNullOrEmpty(jsonName))
jsonName = dt.TableName;
Json.Append("{\"" + jsonName + "\":[");
if (dt.Rows.Count > 0)
{
for (int i = 0; i < dt.Rows.Count; i++)
{
Json.Append("{");
for (int j = 0; j < dt.Columns.Count; j++)
{
Type type = dt.Rows[i][j].GetType();
Json.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":" + StringFormat(dt.Rows[i][j].ToString(), type));
if (j < dt.Columns.Count - 1)
{
Json.Append(",");
}
}
Json.Append("}");
if (i < dt.Rows.Count - 1)
{
Json.Append(",");
}
}
}
Json.Append("]}");
return Json.ToString();
}

/// <summary>
/// DataReader转换为Json
/// </summary>
/// <param name="dataReader">DataReader对象</param>
/// <returns>Json字符串</returns>
public string ToJson(DbDataReader dataReader)
{
StringBuilder jsonString = new StringBuilder();
jsonString.Append("[");
while (dataReader.Read())
{
jsonString.Append("{");
for (int i = 0; i < dataReader.FieldCount; i++)
{
Type type = dataReader.GetFieldType(i);
string strKey = dataReader.GetName(i);
string strValue = dataReader[i].ToString();
jsonString.Append("\"" + strKey + "\":");
strValue = StringFormat(strValue, type);
if (i < dataReader.FieldCount - 1)
{
jsonString.Append(strValue + ",");
}
else
{
jsonString.Append(strValue);
}
}
jsonString.Append("},");
}
dataReader.Close();
jsonString.Remove(jsonString.Length - 1, 1);
jsonString.Append("]");
return jsonString.ToString();
}

/// <summary>
/// DataSet转换为Json
/// </summary>
/// <param name="dataSet">DataSet对象</param>
/// <returns>Json字符串</returns>
public string ToJson(DataSet dataSet)
{
string jsonString = "{";
foreach (DataTable table in dataSet.Tables)
{
jsonString += "\"" + table.TableName + "\":" + ToJson(table) + ",";
}
jsonString = jsonString.TrimEnd(',');
return jsonString + "}";
}

/// <summary>
/// 过滤特殊字符
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public string String2Json(String s)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.Length; i++)
{
char c = s.ToCharArray()[i];
switch (c)
{
case '\"':
sb.Append("\\\""); break;
case '\\':
sb.Append("\\\\"); break;
case '/':
sb.Append("\\/"); break;
case '\b':
sb.Append("\\b"); break;
case '\f':
sb.Append("\\f"); break;
case '\n':
sb.Append("\\n"); break;
case '\r':
sb.Append("\\r"); break;
case '\t':
sb.Append("\\t"); break;
default:
sb.Append(c); break;
}
}
return sb.ToString();
}

/// <summary>
/// 格式化字符型、日期型、布尔型
/// </summary>
/// <param name="str"></param>
/// <param name="type"></param>
/// <returns></returns>
public string StringFormat(string str, Type type)
{
if (type == typeof(string))
{
str = String2Json(str);
str = "\"" + str + "\"";
}
else if (type == typeof(DateTime))
{
str = "\"" + str + "\"";
}
else if (type == typeof(bool))
{
str = str.ToLower();
}
return str;
}



}
}
回复 点赞
hanqing_liu 2011年12月01日
using System.Web.Script.Serialization;

var data = from t in its.ToList()
select new
{};

StringBuilder buider = new StringBuilder();
JavaScriptSerializer json = new JavaScriptSerializer(new SimpleTypeResolver());
json.MaxJsonLength = Int32.MaxValue;
json.Serialize(data.ToList(), buider);
//过滤很简单 自己想办法
回复 点赞
发动态
发帖子
.NET技术社区
创建于2007-09-28

4.9w+

社区成员

66.8w+

社区内容

.NET技术交流专区
社区公告
暂无公告