C# 如何生成树状的Json数据

fengyunzb1 2012-04-05 11:12:35
例如要生成如下的数据:
{"text":".","children": [
{
task:'Project: Shopping',
duration:13.25,
user:'Tommy Maintz',
iconCls:'task-folder',
expanded: true,
children:[{
task:'Housewares',
duration:1.25,
user:'Tommy Maintz',
iconCls:'task-folder',
children:[{
task:'Kitchen supplies',
duration:0.25,
user:'Tommy Maintz',
leaf:true,
iconCls:'task'
},{
task:'Groceries',
duration:.4,
user:'Tommy Maintz',
leaf:true,
iconCls:'task'
},{
task:'Cleaning supplies',
duration:.4,
user:'Tommy Maintz',
leaf:true,
iconCls:'task'
},{
task: 'Office supplies',
duration: .2,
user: 'Tommy Maintz',
leaf: true,
iconCls: 'task'
}]
}, {
task:'Remodeling',
duration:12,
user:'Tommy Maintz',
iconCls:'task-folder',
expanded: true,
children:[{
task:'Retile kitchen',
duration:6.5,
user:'Tommy Maintz',
leaf:true,
iconCls:'task'
},{
task:'Paint bedroom',
duration: 2.75,
user:'Tommy Maintz',
iconCls:'task-folder',
children: [{
task: 'Ceiling',
duration: 1.25,
user: 'Tommy Maintz',
iconCls: 'task',
leaf: true
}, {
task: 'Walls',
duration: 1.5,
user: 'Tommy Maintz',
iconCls: 'task',
leaf: true
}]
},{
task:'Decorate living room',
duration:2.75,
user:'Tommy Maintz',
leaf:true,
iconCls:'task'
},{
task: 'Fix lights',
duration: .75,
user: 'Tommy Maintz',
leaf: true,
iconCls: 'task'
}, {
task: 'Reattach screen door',
duration: 2,
user: 'Tommy Maintz',
leaf: true,
iconCls: 'task'
}]
}]
},{
task:'Project: Testing',
duration:2,
user:'Core Team',
iconCls:'task-folder',
children:[{
task: 'Mac OSX',
duration: 0.75,
user: 'Tommy Maintz',
iconCls: 'task-folder',
children: [{
task: 'FireFox',
duration: 0.25,
user: 'Tommy Maintz',
iconCls: 'task',
leaf: true
}, {
task: 'Safari',
duration: 0.25,
user: 'Tommy Maintz',
iconCls: 'task',
leaf: true
}, {
task: 'Chrome',
duration: 0.25,
user: 'Tommy Maintz',
iconCls: 'task',
leaf: true
}]
},{
task: 'Windows',
duration: 3.75,
user: 'Darrell Meyer',
iconCls: 'task-folder',
children: [{
task: 'FireFox',
duration: 0.25,
user: 'Darrell Meyer',
iconCls: 'task',
leaf: true
}, {
task: 'Safari',
duration: 0.25,
user: 'Darrell Meyer',
iconCls: 'task',
leaf: true
}, {
task: 'Chrome',
duration: 0.25,
user: 'Darrell Meyer',
iconCls: 'task',
leaf: true
},{
task: 'Internet Exploder',
duration: 3,
user: 'Darrell Meyer',
iconCls: 'task',
leaf: true
}]
},{
task: 'Linux',
duration: 0.5,
user: 'Aaron Conran',
iconCls: 'task-folder',
children: [{
task: 'FireFox',
duration: 0.25,
user: 'Aaron Conran',
iconCls: 'task',
leaf: true
}, {
task: 'Chrome',
duration: 0.25,
user: 'Aaron Conran',
iconCls: 'task',
leaf: true
}]
}]
}
]}

我知道可以用newtonsoft.json.dll 但最关键的是不知道怎么构建这样的结构,


请大侠们指点指点,数据不必要有上面的多,但希望能体现上面的树状结构
...全文
1484 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
bonnibell 2012-05-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

ext js 弹出框的yes和no位置在交错在一起是什么回事
[/Quote]

是否修改了ext-base.js 里的

BLANK_IMAGE_URL:"/js/ext-2.0/resources/images/default/s.gif"

bonnibell 2012-05-12
  • 打赏
  • 举报
回复

protected void Page_Load(object sender, EventArgs e)
{


StringWriter sw = new StringWriter();
JsonWriter writer = new JsonWriter(sw);
writer.WriteStartObject();
writer.WritePropertyName("text");
writer.WriteValue(".");


writer.WritePropertyName("children");
writer.WriteStartArray();

for (int i = 0; i < 10; i++) //查询数据库
{
writer.WriteStartObject();

writer.WritePropertyName("task");
writer.WriteValue("task" + i.ToString());

writer.WritePropertyName("duration");
writer.WriteValue("duration" + i.ToString());

writer.WritePropertyName("user");
writer.WriteValue("user" + i.ToString());

writer.WritePropertyName("iconCls");
writer.WriteValue("iconCls" + i.ToString());

writer.WritePropertyName("expanded");
writer.WriteValue(true);

if (true) //查询数据,判断是否含有子结点
{
MakeChildNode(writer);
}
else
{
writer.WritePropertyName("leaf");
writer.WriteValue(true);
}
writer.WriteEndObject();
}
writer.WriteEndArray();

writer.WriteEndObject();
writer.Flush();

string jsonText = sw.GetStringBuilder().ToString();
Response.Write(jsonText);
}

private void MakeChildNode(JsonWriter writer)
{
writer.WritePropertyName("children");
writer.WriteStartArray();

for (int i = 0; i < 5; i++)
{
writer.WriteStartObject();

writer.WritePropertyName("task");
writer.WriteValue("childrentask" + i.ToString());

writer.WritePropertyName("duration");
writer.WriteValue("childrenduration" + i.ToString());

writer.WritePropertyName("user");
writer.WriteValue("childrenuser" + i.ToString());

writer.WritePropertyName("iconCls");
writer.WriteValue("childreniconCls" + i.ToString());

writer.WritePropertyName("expanded");
writer.WriteValue(true);

if (false) //判断是否含有子结点,有的话递归
{
MakeChildNode(writer);
}
else
{
writer.WritePropertyName("leaf");
writer.WriteValue(true);
}

writer.WriteEndObject();
}

writer.WriteEndArray();
}

memorymultitree 2012-05-12
  • 打赏
  • 举报
回复

===================================================
关于生成树形JSON的标准解决方案请见:
http://www.iteye.com/topic/1122125
===================================================
flyerwing 2012-04-13
  • 打赏
  • 举报
回复
JavaScriptSerializer 这个类是可以做到的了,
如果想要那个功能好点的可以那个用第三放的了
CalvinR 2012-04-13
  • 打赏
  • 举报
回复
列树吗?
fengyunzb1 2012-04-12
  • 打赏
  • 举报
回复
ExtJS comfirm的弹出框Yes和No交错到一起了是怎么回事
chen_ya_ping 2012-04-11
  • 打赏
  • 举报
回复
新建一个这样结构的类,然后fill数据,然后转换成JSON,应该就是你想要的。
色拉油 2012-04-11
  • 打赏
  • 举报
回复
建一个类然后序列化
anzhiqiang_touzi 2012-04-10
  • 打赏
  • 举报
回复
把你的类写成复合类型
然后用JavaScriptSerializer 序列化
fengyunzb1 2012-04-10
  • 打赏
  • 举报
回复
ext js 弹出框的yes和no位置在交错在一起是什么回事
传递正能量 2012-04-06
  • 打赏
  • 举报
回复
JSON是Javascript中常用的数据格式,然而,在.NET 2.0中没有内置序列化JSON的类,原因估计是当时Ajax尚未兴起。后来就有人写了一个Json.NET类库。.NET 3.5新增了一个把对象序列化为JSON字符串的类JavaScriptSerializer。这个类位于System.Web.Script.Serialization名字空间中(非Web项目需要添加System.Web.Extensions.dll引用),其使用方法也是非常简单的:

// 分类
public class Category
{
  public int CategoryId { get; set; } // 分类编号
  public string CategoryName { get; set; } // 分类名
}

Category testCategory = new Category()
{
  CategoryId = 1,
  CategoryName = "Test"
};

JavaScriptSerializer serializer = new JavaScriptSerializer();
Console.Write(serializer.Serialize(testCategory)); // 调用Serialize方法进行序列化
如果不希望序列化某个属性,可以给该属性标记为ScriptIgnore:

public class Category
{
  [ScriptIgnore]
  public int CategoryId { get; set; }
  public string CategoryName { get; set; }
}
事实上,Serialize方法是个递归方法,会递归地序列化对象的属性,因此在序列化一个复杂对象(比如DataTable)时往往会出现“循环引用”的异常,这时候就需要针对复杂类型自定义一个转换器。下面是DataTable的转换器,原理是把DataTable转换成一个字典列表后再序列化:

/// <summary>
/// DataTable JSON转换类
/// </summary>
public class DataTableConverter : JavaScriptConverter
{
  public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
  {
    DataTable dt = obj as DataTable;
    Dictionary<string, object> result = new Dictionary<string, object>();

    List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();

    foreach (DataRow dr in dt.Rows)
    {
      Dictionary<string, object> row = new Dictionary<string, object>();
      foreach (DataColumn dc in dt.Columns)
      {
          row.Add(dc.ColumnName, dr[dc.ColumnName]);
      }
      rows.Add(row);
    }

    result["Rows"] = rows;

    return result;
  }

  public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
  {
    throw new NotImplementedException();
  }

  /// <summary>
  /// 获取本转换器支持的类型
  /// </summary>
  public override IEnumerable<Type> SupportedTypes
  {
    get { return new Type[] { typeof(DataTable) }; }
  }
}
所有自定义的转换器都要继承于JavaScriptConverter,并实现Serialize、Deserialize方法和SupportedTypes属性,其中SupportedTypes属性用于枚举此转换器支持的类型。定义了一个新的转换器后需要将其实例化并注册到JavaScriptSerializer对象:

JavaScriptSerializer JsonSerializer = new JavaScriptSerializer();
JsonSerializer.RegisterConverters(
  new JavaScriptConverter[]
  {
    new DataTableConverter()
  }
);
对于DateTime类型,JavaScriptSerializer默认将其序列化为 "\/Date(ticks)\/" 格式的字符串,这明显需要Javascript作进一步的解释,非常多余。笔者建议各位根据需要添加一个DateTime类型的转换器。


来源:http://heeroluo.net/ShowArticle15.aspx
fengyunzb1 2012-04-06
  • 打赏
  • 举报
回复
谢谢楼上两位的回答 但没有一个解决实质性的问题
冰镇宝贝321 2012-04-06
  • 打赏
  • 举报
回复
亲 给你个建议哈 提问题 代码要把他格式弄好 最好用代码插入工具

http://blog.csdn.net/shaily/article/details/4205135

这个你看看 不知道能不能解决

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧