原文

WPF:使用Json.NET在TreeView中树形显示JSON数据

读者可以参考这个开源的可以树形显示XML和JSON的工具:

Mgen Object 603:XML/JSON树形显示小工具

或者一个更大的开源工程(构建和分析HTTP并支持XML及JSON的树形显示):

Mgen Bluckbadda

效果如下:

(每一个项目中的左侧黑字是数据的值,右侧灰字是数据的类型。对于对象或数组,黑字会显示对象的属性个数或数组的成员个数)

(上图中的JSON数据来自:http://www.jsonexample.com/ 中的最下面的示例JSON)

具体实现方法是通过利用Json.NET中的Json对象基类:JToken类型,在Newtonsoft.Json.Linq命名空间内,这个类型的派生类型有:

JValue类型代表着一个Json数据值,也就是不会再有子节点的原子值。

而另一个JToken的直接继承者是JContainer类型,代表数据对象有子节点,它的派生类型:JProperty,JObject和JArray分别代表属性,对象和数组。

我最初想到的是用JToken类型的Type属性来构建树,但是随后发现JTokenType的定义完全平面化,不利于不同类型成员结构的创建,于是采用直接判断JToken对象类型的方式来构建树。也就是直接根据不同JToken类型来生成其相应的成员节点数据。

整个树的数据类型由一个类型来完成,名称是JsonHeaderLogic,它定义三个属性:

public string Header { get; private set; }

public IEnumerable<JsonHeaderLogic> Children { get; private set; }

public JToken Token { get; private set; }

Header是当前节点的显示文字。

Children是子节点。(如果没有的话值是null)

Token是原始的Json.NET中的JToken对象。

那么在界面上,我们就可以直接使用WPF中TreeView和HierarchicalDataTemplate来这样定义DataTemplate:

<TreeView Name="treeView">

<TreeView.ItemTemplate>

<HierarchicalDataTemplate ItemsSource="{Binding Children}">

<StackPanel Orientation="Horizontal">

<!-- 显示Header属性 -->

<TextBlock Text="{Binding Header}"/>

<!-- 显示JToken的Type属性 -->

<TextBlock Text="{Binding Token.Type}" Margin="10 0 0 0" Foreground="Gray"/>

</StackPanel>

</HierarchicalDataTemplate>

</TreeView.ItemTemplate>

</TreeView>

JsonHeaderLogic类型的完整定义:

//+ using Newtonsoft.Json.Linq;

class JsonHeaderLogic

{

//用于对应Json对象类型的格式化字符

const string NULL_TEXT = "<null>";

const string ARRAY = "[{0}]";

const string OBJECT = "[{0}]";

const string PROPERTY = "{0}";

//用于界面绑定的属性定义

public string Header { get; private set; }

public IEnumerable<JsonHeaderLogic> Children { get; private set; }

public JToken Token { get; private set; }

//内部构造函数,使用FromJToken来创建JsonHeaderLogic

JsonHeaderLogic(JToken token, string header, IEnumerable<JsonHeaderLogic> children)

{

Token = token;

Header = header;

Children = children;

}

//外部的从JToken创建JsonHeaderLogic的方法

public static JsonHeaderLogic FromJToken(JToken jtoken)

{

if (jtoken == null)

{

throw new ArgumentNullException("jtoken");

}

var type = jtoken.GetType();

if (typeof(JValue).IsAssignableFrom(type))

{

var jvalue = (JValue)jtoken;

var value = jvalue.Value;

if (value == null)

value = NULL_TEXT;

return new JsonHeaderLogic(jvalue, value.ToString(), null);

}

else if (typeof(JContainer).IsAssignableFrom(type))

{

var jcontainer = (JContainer)jtoken;

var children = jcontainer.Children().Select(c => FromJToken(c));

string header;

if (typeof(JProperty).IsAssignableFrom(type))

header = String.Format(PROPERTY, ((JProperty)jcontainer).Name);

else if (typeof(JArray).IsAssignableFrom(type))

header = String.Format(ARRAY, children.Count());

else if (typeof(JObject).IsAssignableFrom(type))

header = String.Format(OBJECT, children.Count());

else

throw new Exception("不支持的JContainer类型");

return new JsonHeaderLogic(jcontainer, header, children);

}

else

{

throw new Exception("不支持的JToken类型");

}

}

}

定义好了JsonHeaderLogic类型,在相应界面事件后使用FromJToken方法来创建JsonHeaderLogic对象然后绑定到界面TreeView控件数据源就可以了:

//创建JObject

//textfile1.txt存储着需要解析的JSON数据

var jobj = JObject.Parse(System.IO.File.ReadAllText("textfile1.txt"));

//创建TreeView的数据源

treeView.ItemsSource = jobj.Children().Select(c => JsonHeaderLogic.FromJToken(c));

源代码下载 
下载地址 
注意:此为微软SkyDrive存档,请用浏览器直接下载,用某些下载工具可能无法下载 
示例程序运行环境:.NET Framework 4.0 Client Profile 
源代码环境:Microsoft Visual Studio Express 2012 for Windows Desktop 
注意:源代码不包含引用的外部类库文件: Json.NET

WPF:使用Json.NET在TreeView中树形显示JSON数据相关推荐

  1. 将TreeView中导出为XML数据

    //使用范例: TreeViewToXmlB m_TreeViewToXmlB = new TreeViewToXmlB();  m_TreeViewToXmlB.exportToXml(this.T ...

  2. java解析json数组对象_JAVA中快速解析JSON对象里包含的JSON数组

    例如现在有这样一个Json String Value =  {"data":[{"school_name":"西北农林科技大学"," ...

  3. 中livechart显示大数据_Servlet中利用jdbc加载显示数据

    基本分层思路是 已经完成查询所有新闻的方法在DAO中 最后将数据返回 现在我们去service中完成代码,先准备一个接口 编写一个实现类 编写代码,在Service中只会出现Dao的东西 然后在我们之 ...

  4. android怎么根据标题解析json,如何在android中解析没有json对象标题的json数组?

    首先,我创建了解析器类JSONParser.java package com.example.myparse; import java.io.BufferedReader; import java.i ...

  5. 中livechart显示大数据_Kaggle 大数据竞赛中的Tricks总结

    作者 | Prince Canuma 编译 | AI有道, ronghuaiyang 任何领域的成功都可以归结为一套小规则和基本原则,当它们结合在一起时会产生伟大的结果. 机器学习和图像分类也不例外, ...

  6. 中livechart显示大数据_大数据显示:辽宁新基建技能人才存量居全国第十位

    5月26日,智联招聘基于招聘和求职大数据,发布<2020年新基建产业人才发展报告>.<报告>显示,今年一季度,我省新基建产业人才招聘需求人数占全国比重为2.84%,位居全国第1 ...

  7. android动态显示表格数据,android中水平显示表格数据

    今天工作任务提前完成了,就抽空更新一下博客,这篇博客以前我在其他论坛上发表过,今天有空就把它拉过来:制作表格一般来讲都是一条一条数据垂直显示,今天我们就将表格数据水平分布显示:下面请看效果图: 一.两 ...

  8. Echarts中tooltip显示的数据与数据本身顺序相反

    echarts中默认的tooltip和柱状图显示顺序相反,客户要求表盘,tooltip,图例显示顺序一致,也就是五线城市在tooltip和图例中都需要第一个显示: 解决方式: 修改tooltip的fo ...

  9. Linux下vi修改行距,调整label中text显示的行间距

    iOS UILabel UITextView UIButton 等等显示文本行间距 iOS UILabel  UITextView UIButton 等等显示文本行间距都用如下方法 NSMutable ...

最新文章

  1. 30~60万|项目需求——胳膊与手指的动态识别技术
  2. 个人开发者接入支付宝,Android开发接入支付宝支付...
  3. windows中 修改某种文件图标 的方法 (备忘)
  4. 常用命令-tar 加密
  5. android开机logo制作工具,Android 开机Logo制作
  6. 不出来信号 quartus_男人一旦动了真情,会向你发出这6个“信号”不爱的人装不出来...
  7. 为什么R语言是学习数据分析的第一选择
  8. 训练集山准确率高测试集上准确率很低_拒绝DNN过拟合,谷歌准确预测训练集与测试集泛化差异,还开源了数据集 | ICLR 2019...
  9. ubuntu mysql ftp_ubuntu上搭建vsftpd且通过mysql来管理FTP账号
  10. Bug 险中求: 作为新手,我怎样才能快速找到不和别人重复的第一个 bug?
  11. busybox date 时间的加减
  12. 【图像隐写】基于matlab LSB算法图像隐写提取【含Matlab源码 366期】
  13. 不挖坑比努力填坑更值得
  14. ios 自动缩小字体_iOS WKWebview字体自动放大的问题
  15. 数据分析与预测课程设计
  16. Navicat中文版破解安装
  17. 华为交换机Hybird 与 单臂路由
  18. SlideLive:提供关系型PPT模板下载
  19. SEO学习笔记一:Google搜索引擎背后的运作模式
  20. 三颗种子开发系统源码

热门文章

  1. vue学习笔记(1)-组件通信
  2. Junit单元测试学习笔记(一)
  3. python疑问5:位置参数,默认参数,可变参数,关键字参数,命名关键字参数区别...
  4. 前端开发学习的基础网站
  5. 31.水平居中总结-不定宽块状元素方法(三)
  6. 转自把《编程珠玑》读薄
  7. ORACLE -- ORA-12520
  8. 远程桌面mstsc命令参数的使用
  9. 由VMWorld2010想到的Social Media宣传
  10. 激光光凝手术的副作用和必要性