WPF:使用Json.NET在TreeView中树形显示JSON数据
原文
WPF:使用Json.NET在TreeView中树形显示JSON数据
读者可以参考这个开源的可以树形显示XML和JSON的工具:
Mgen Object 603:XML/JSON树形显示小工具
或者一个更大的开源工程(构建和分析HTTP并支持XML及JSON的树形显示):
效果如下:

(每一个项目中的左侧黑字是数据的值,右侧灰字是数据的类型。对于对象或数组,黑字会显示对象的属性个数或数组的成员个数)
(上图中的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数据的更多相关文章
- jeecg中树形显示的用法
1.GoodsController中显示的方法如下: @RequestMapping(params = "goodsgrid") @ResponseBody public Obje ...
- WinForm中DataGridView显示更新数据--人性版
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- C# 实现将listview中已经显示的数据导出到Access 数据库
private void button1_Click(object sender, EventArgs e) { OleDbConnection dbconn = new OleDbConnectio ...
- ElementUI中 el-table-column 显示的数据为多个返回数据的拼接
遇到个问题就是其中有个要展示的数据来自接口返回的两个字段. 原用法是: 原以为prop=" "中只能放一个字段的数据,想放两个字段数据的话,要把 <el-table-colu ...
- javascript中字符串格式json如何转化成json对象
什么是JSON JSON(JavaScript Object Notation)是一种优美的JavaScript对象创建方法.JSON也是一种轻量级数据交换格式.JSON非常易于人阅读与编写,同时利于 ...
- Java中使用org.json和json-lib解析JSON
文章目录 [隐藏] 一.JavaProject中org.json解析JSON 1.JSON的org.son-api下载 1)JSON网址 2)JSON的java解析org.json-api网址 3) ...
- JSON 学习总结 <一>:什么是JSON
JSON的相关资料和博客很多,JSON无处不用,最近项目中一直要用到JSON,今天没有加班,就写下,算是对自己的总结,对JSON又一次深入的认识. 废话不多了,直接进入今天的主题: 如题:今天就介绍下 ...
- 树形结构JSON的实现方法
在Web应用程序开发领域,基于Ajax技术的JavaScript树形控件已经被广泛使用,它用来在Html页面上展现具有层次结构的数据项.目前市场上常见的JavaScript框架及组件库中均包含自己的树 ...
- 潜移默化学会WPF(难点控件treeview)--改造TreeView(CheckBox多选择版本),递归绑定数据
原文:潜移默化学会WPF(难点控件treeview)--改造TreeView(CheckBox多选择版本),递归绑定数据 目前自己对treeview的感慨很多 今天先讲 面对这种 表结构的数据 的其中 ...
随机推荐
- maven项目启动
1服务install 2 build (tomcat:run)
- [C/C++标准库]_[0基础]_[优先队列priority_queue的使用]
std::priority_queue 场景: 1. 对于一个任务队列,任务的优先级由任务的priority属性指明,这时候就须要优先级越高的先运行.而queue并没有排序功能,这时priority_ ...
- java设计模式(二)单例模式 建造者模式
(三)单例模式 单例模式应该是最常见的设计模式,作用是保证在JVM中,该对象仅仅有一个实例存在. 长处:1.降低某些创建比較频繁的或者比較大型的对象的系统开销. 2.省去了new操作符,减少系统内存使 ...
- JS 在html中的位置
前言 当我了解完html在浏览器中的解析渲染流程后,反而又发现了新的困扰自己的问题. Q:即然html要渲染需要渲染树,而渲染树又需要DOMTree和CSSRuleTree,DOMTree需要解析HT ...
- HTML静态网页(图片热点、网页划区、拼接及表单的使用)
图片热点: 规划出图片上的一个区域,可以做出超链接,直接点击图片区域就可以完成跳转的效果. 示例: 网页划区: 在一个网页里,规划出一个区域用来展示另一个网页的内容. 示例: 网页的拼接: 在一个 ...
- iOS现有工程 集成 Cordova/Ionic
首先, 新建 Cordova 项目就不说了, 步骤: http://ionicframework.com/getting-started/ , cordova生成的项目用cdv_project称呼, ...
- [LeetCode]题解(python):131-Palindrome Partitioning
题目来源: https://leetcode.com/problems/palindrome-partitioning/ 题意分析: 给定一个字符串s,将s拆成若干个子字符串,使得所有的子字符串都是回 ...
- SIM卡厂商的识别方法
ICCID(SIM卡号码)的定义应该是: 1-6位:国际移动运营商识别码(IMSI),898600为中国移动,898601为中国联通 7-20位:移动和联通的定义是不同的. 中国移动: 第7.8 ...
- 微软的MCE(Media Center Edition 媒体中心)标准
Windows VISTA和Windows 7操作系统上,电脑遥控器01RN的强劲功能更是发挥得淋漓尽致,不仅可以单凭遥控器一键即实现“听歌.看碟.播放控制.曲目选择.照片欣赏.幻灯片播放.网络电影电 ...
- cocos2d-x中的尺寸之二
接下来我们再做些坏事,比如给EGLView设置分辨率,代码如下: pEGLView->setDesignResolutionSize(240, 320, kResolutionExactFit) ...