WPF:使用Json.NET在TreeView中树形显示JSON数据
原文
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数据相关推荐
- 将TreeView中导出为XML数据
//使用范例: TreeViewToXmlB m_TreeViewToXmlB = new TreeViewToXmlB(); m_TreeViewToXmlB.exportToXml(this.T ...
- java解析json数组对象_JAVA中快速解析JSON对象里包含的JSON数组
例如现在有这样一个Json String Value = {"data":[{"school_name":"西北农林科技大学"," ...
- 中livechart显示大数据_Servlet中利用jdbc加载显示数据
基本分层思路是 已经完成查询所有新闻的方法在DAO中 最后将数据返回 现在我们去service中完成代码,先准备一个接口 编写一个实现类 编写代码,在Service中只会出现Dao的东西 然后在我们之 ...
- android怎么根据标题解析json,如何在android中解析没有json对象标题的json数组?
首先,我创建了解析器类JSONParser.java package com.example.myparse; import java.io.BufferedReader; import java.i ...
- 中livechart显示大数据_Kaggle 大数据竞赛中的Tricks总结
作者 | Prince Canuma 编译 | AI有道, ronghuaiyang 任何领域的成功都可以归结为一套小规则和基本原则,当它们结合在一起时会产生伟大的结果. 机器学习和图像分类也不例外, ...
- 中livechart显示大数据_大数据显示:辽宁新基建技能人才存量居全国第十位
5月26日,智联招聘基于招聘和求职大数据,发布<2020年新基建产业人才发展报告>.<报告>显示,今年一季度,我省新基建产业人才招聘需求人数占全国比重为2.84%,位居全国第1 ...
- android动态显示表格数据,android中水平显示表格数据
今天工作任务提前完成了,就抽空更新一下博客,这篇博客以前我在其他论坛上发表过,今天有空就把它拉过来:制作表格一般来讲都是一条一条数据垂直显示,今天我们就将表格数据水平分布显示:下面请看效果图: 一.两 ...
- Echarts中tooltip显示的数据与数据本身顺序相反
echarts中默认的tooltip和柱状图显示顺序相反,客户要求表盘,tooltip,图例显示顺序一致,也就是五线城市在tooltip和图例中都需要第一个显示: 解决方式: 修改tooltip的fo ...
- Linux下vi修改行距,调整label中text显示的行间距
iOS UILabel UITextView UIButton 等等显示文本行间距 iOS UILabel UITextView UIButton 等等显示文本行间距都用如下方法 NSMutable ...
最新文章
- 30~60万|项目需求——胳膊与手指的动态识别技术
- 个人开发者接入支付宝,Android开发接入支付宝支付...
- windows中 修改某种文件图标 的方法 (备忘)
- 常用命令-tar 加密
- android开机logo制作工具,Android 开机Logo制作
- 不出来信号 quartus_男人一旦动了真情,会向你发出这6个“信号”不爱的人装不出来...
- 为什么R语言是学习数据分析的第一选择
- 训练集山准确率高测试集上准确率很低_拒绝DNN过拟合,谷歌准确预测训练集与测试集泛化差异,还开源了数据集 | ICLR 2019...
- ubuntu mysql ftp_ubuntu上搭建vsftpd且通过mysql来管理FTP账号
- Bug 险中求: 作为新手,我怎样才能快速找到不和别人重复的第一个 bug?
- busybox date 时间的加减
- 【图像隐写】基于matlab LSB算法图像隐写提取【含Matlab源码 366期】
- 不挖坑比努力填坑更值得
- ios 自动缩小字体_iOS WKWebview字体自动放大的问题
- 数据分析与预测课程设计
- Navicat中文版破解安装
- 华为交换机Hybird 与 单臂路由
- SlideLive:提供关系型PPT模板下载
- SEO学习笔记一:Google搜索引擎背后的运作模式
- 三颗种子开发系统源码