原文

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. jeecg中树形显示的用法

    1.GoodsController中显示的方法如下: @RequestMapping(params = "goodsgrid") @ResponseBody public Obje ...

  2. WinForm中DataGridView显示更新数据--人性版

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  3. C# 实现将listview中已经显示的数据导出到Access 数据库

    private void button1_Click(object sender, EventArgs e) { OleDbConnection dbconn = new OleDbConnectio ...

  4. ElementUI中 el-table-column 显示的数据为多个返回数据的拼接

    遇到个问题就是其中有个要展示的数据来自接口返回的两个字段. 原用法是: 原以为prop=" "中只能放一个字段的数据,想放两个字段数据的话,要把 <el-table-colu ...

  5. javascript中字符串格式json如何转化成json对象

    什么是JSON JSON(JavaScript Object Notation)是一种优美的JavaScript对象创建方法.JSON也是一种轻量级数据交换格式.JSON非常易于人阅读与编写,同时利于 ...

  6. Java中使用org.json和json-lib解析JSON

    文章目录  [隐藏] 一.JavaProject中org.json解析JSON 1.JSON的org.son-api下载 1)JSON网址 2)JSON的java解析org.json-api网址 3) ...

  7. JSON 学习总结 <一>:什么是JSON

    JSON的相关资料和博客很多,JSON无处不用,最近项目中一直要用到JSON,今天没有加班,就写下,算是对自己的总结,对JSON又一次深入的认识. 废话不多了,直接进入今天的主题: 如题:今天就介绍下 ...

  8. 树形结构JSON的实现方法

    在Web应用程序开发领域,基于Ajax技术的JavaScript树形控件已经被广泛使用,它用来在Html页面上展现具有层次结构的数据项.目前市场上常见的JavaScript框架及组件库中均包含自己的树 ...

  9. 潜移默化学会WPF(难点控件treeview)--改造TreeView(CheckBox多选择版本),递归绑定数据

    原文:潜移默化学会WPF(难点控件treeview)--改造TreeView(CheckBox多选择版本),递归绑定数据 目前自己对treeview的感慨很多 今天先讲 面对这种 表结构的数据 的其中 ...

随机推荐

  1. [Ext JS 4] 布局之实战一 - 中间区块不会自动伸展 (tab)

    前言 [Ext JS 4] 布局之实战一 - 中间区块不会自动伸展 (tab) 在上一篇中,中间的tab 区块无法自动伸展的原因一句话说就是: 使用contentEL的方式,相关HTML元素不会参与组 ...

  2. 2015腾讯暑期实习生 Web前端开发 面试经历 --作者imwtr

    1.现在有100亿个数字大小为1到10亿的数字,在这100亿个数字里边只有一个数字出现的次数是奇数次的,你用什么方法,找出这个数字呢? 答:显然至少要全部过一遍,可以用位运算,遍历数组,最后剩下的数字 ...

  3. redis在java项目中的使用

    在上一篇文章中已经讲了redis的spring配置,这篇将会描述redis在java项目中的使用. redis存储形式都是key-value(键值对),按照存储的内容分为两种,一种是存简单数据,即数字 ...

  4. (转)原子操作 Interlocked系列函数

    上一篇<多线程第一次亲密接触 CreateThread与_beginthreadex本质区别>中讲到一个多线程报数功能.为了描述方便和代码简洁起见,我们可以只输出最后的报数结果来观察程序是 ...

  5. BZOJ 2440: [中山市选2011]完全平方数( 二分答案 + 容斥原理 + 莫比乌斯函数 )

    先二分答案m,<=m的有m-∑(m/pi*pi)+∑(m/pi*pi*pj*pj)-……个符合题意的(容斥原理), 容斥系数就是莫比乌斯函数μ(预处理)... ----------------- ...

  6. PHP学习笔记7-JSON数据操作

    JSON,全称是JavaScript Object Notation.它是基于JavaScript编程语言ECMA-262 3rd Edition-December 1999标准的一种轻量级的数据交换 ...

  7. what does Html.HiddenFor () for ?

    When I want to pass some value that won't be seen by users, I find it useful to use this. It can hel ...

  8. 清除缓存、开启IO统计

    SQL性能优化前期准备-清除缓存.开启IO统计 如果需要进行SQl Server下的SQL性能优化,需要准备以下内容: 一.SQL查询分析器设置: 1.开启实际执行计划跟踪. 2.每次执行需优化SQL ...

  9. 一个最简的 USB Audio 示例

    经过了两三个月的痛苦,USB 协议栈的 Audio Device Class 框架已具雏形了,用了两三天时间,使用这个框架实战了一个基于新唐 M0 的最简单的 USB Audio 程序,可以作为 US ...

  10. QT不让windows休眠的方法

    对于一些Windows应用程序,必须要保证os不能休眠才能有效工作,如迅雷下载软件,如果os进入休眠,则会导致网络不正常,从而导致不能下载东西.那木有没有1种机制,当打开软件的时候,就自动将os设为不 ...