IList嵌套转JSON问题

sharp_scr sharp_scr 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

项目里面有2个类A和B,类B以IList或者List的形式作为类A的成员变量,具体关系如下:

类A:
namespace EB.Common
{
public class A
{
private string _id;
private string _name;
private string _code;
IList<EB.Common.B> _detail;

public string ID
{
set { _id = value; }
get { return _id; }
}

public string Name
{
set { _name = value; }
get { return _name; }
}

public string Code
{
set { _code = value; }
get { return _code; }
}

public IList<EB.Common.B> Detail
{
set { _detail = value; }
get { return _detail; }
}

}
}


类B:
namespace EB.Common
{
public class B
{
private string _id;
private int _num;
private string _type;

public string ID
{
set { _id = value; }
get { return _id; }
}

public int Num
{
set { _num = value; }
get { return _num; }
}

public string Type
{
set { _type = value; }
get { return _type; }
}
}
}



现在从后台获取到类A的查询结果,该结果也是一个IList集合
IList<EB.Common.A>
,现在要给前台返回JSON格式的数据,从网上找了一个通过反射和泛型把IList转换为JSON字符串,转换代码如下:
public static string EntityToJson(IList<T> items)
{
StringBuilder Json = new StringBuilder();
Json.Append("[");
if (items.Count > 0)
{
for (int i = 0; i < items.Count; i++)
{
T obj = Activator.CreateInstance<T>();
Type type = obj.GetType();
PropertyInfo[] pis = type.GetProperties();
Json.Append("{");
for (int j = 0; j < pis.Length; j++)
{
Json.Append("\"" + pis[j].Name.ToString() + "\":\"" + pis[j].GetValue(items[i], null) + "\"");
if (j < pis.Length - 1)
{
Json.Append(",");
}
}
Json.Append("}");
if (i < items.Count - 1)
{
Json.Append(",");
}
}
}
Json.Append("]");
return Json.ToString();
}



如果是正常情况,类的成员变量都是单一类型时(不是Array或List这种),通过下面这种调用方式不会有问题:
//IList<EB.Common.A> rlist = 从数据库获取的数据结果集
string jsonStr = EB.Common.Convertor.IListToJson.JsonHelper<EB.Common.A>.EntityToJson(rlist);



现在就是这种类A的成员变量是个IList集合,在转JSON的时候第二层就有问题:

public static string EntityToJson(IList<T> items)
{
StringBuilder Json = new StringBuilder();
Json.Append("[");
if (items.Count > 0)
{
for (int i = 0; i < items.Count; i++)
{
T obj = Activator.CreateInstance<T>();
Type type = obj.GetType();


PropertyInfo[] pis = type.GetProperties();
Json.Append("{");
for (int j = 0; j < pis.Length; j++)
{
//这里判断类的成员变量是否是IList集合类型
if (pis[j].PropertyType.Name == "IList`1" && pis[j].PropertyType.Namespace == "System.Collections.Generic")
{
//这里如何实现递归调用生成第二层json?
//EntityToJson(IList < T > items);
}
else
{
Json.Append("\"" + pis[j].Name.ToString() + "\":\"" + pis[j].GetValue(items[i], null) + "\"");
if (j < pis.Length - 1)
{
Json.Append(",");
}
}
Json.Append("}");
if (i < items.Count - 1)
{
Json.Append(",");
}
}
}
}
Json.Append("]");
return Json.ToString();
}


请各位高手能够给点思路,或者有没有其他好的方法解决,先谢了!
...全文

相关推荐

C# 解析json格式数据为IList

C# 解析json格式数据为IList

天下如山

C#动态对象实战:Clay行为驱动的动态编程模型

在强类型语言中实现安全可控的动态行为,是现代.NET开发的关键能力之一。Clay通过Behavior模式重构dynamic语义,以TryGetMember/TryInvokeMember等运行时拦截机制,替代ExpandoObject的简单字典存储,天然支持链式调用、动态集合与接口桥接。其核心价值在于不破坏编译期类型安全的前提下,提供类似JavaScript的对象灵活性,特别适用于JSON结构映射、CMS内容建模、API适配层及配置驱动型系统。本文深入解析Clay的ClayBehavior设计哲学、Clay

chuji3953

Unity PlayerPrefs 进阶封装:1套反射方案支持List/Dictionary存储

本文介绍了一种基于反射的Unity PlayerPrefs进阶封装方案,突破了原生仅支持基础数据类型的限制,实现了对List<T>和Dictionary<K,V>等泛型集合的存储与读取。通过自动类型识别、递归处理嵌套对象和安全键名生成等核心技术,为游戏开发提供了更灵活的数据持久化解决方案,特别适合需要存储复杂游戏数据的场景。

weixin_30813225

CLR泛型底层原理:JIT实例化、约束验证与协变机制解析

泛型是.NET类型系统的核心机制,其本质并非语法糖,而是由CLR在运行时严格保障的类型契约。理解泛型需从IL元数据结构出发,掌握JIT如何为值类型和引用类型分别生成专用机器码,以及`where T : class/struct`等约束如何直接影响内存布局与方法分发路径。泛型协变与逆变并非类型转换,而是CLR对虚表调用链的拓扑重写,仅适用于接口和委托。技术价值体现在性能优化(如避免装箱)、内存控制(栈/堆分离)与类型安全强化;典型应用场景包括高性能集合库开发、DI容器泛型服务解析、序列化框架适配及AOT预编译

didi9310

C#实现简单的JSON序列化功能代码实例

主要介绍了C#实现简单的JSON序列化功能,大家可以参考使用

weixin_38697808
评论 14
收藏 已收藏
分享
返回顶部
sharp_scr
C# 111,129 成员 642,538 内容