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

时间: 2024-08-31 06:50:51

WPF:使用Json.NET在TreeView中树形显示JSON数据的相关文章

在Excel中突出显示重复数据

朋友鸿在一所学校的教务处工作,他用http://www.aliyun.com/zixun/aggregation/16544.html">Excel管理学生的成绩,他想把同名学生的成绩数据突出显示出来(改变字体和单元格填充颜色),我建议他用"条件格式"来实现. 1. 启动Excel 2003(基本版本相似),打开学生成绩表. 2. 同时选中数据所在的单元格区域(如B2至J2001),执行"格式→条件格式"命令,打开"条件格式" 对

c#项目c1flexgrid中数据树形显示问题

问题描述 c#项目c1flexgrid中数据树形显示问题 在开发的C#项目中,c1flexgrid的数据源有好几个表,如何实现按照c1flexgrid中某一列的值进行树形显示,值相同的折叠起来,可折叠可展开的那种.我用了subtotal函数,但是值相同的没有合并起来,不知道为什么.需要怎么具体实现啊?谢谢了,在线等啊!求大神帮忙 解决方案 求教,如何从sqlserver中树形显示

js中如何处理数据,使其在页面中换行显示

问题描述 js中如何处理数据,使其在页面中换行显示 查出数据是一段string类型的数字,如(26,110,9745,1964,8357,2654,45698,45698,12564,45894,45698,56455,45698,51236,21598,45875,54687,456987),显示在表格中的一列中,显然是显示不下的,现在判断长度大于6时,在表格的这列中换行显示,这个操作写在js中,怎么实现?(如果有不清楚的地方,请指出,,,) 解决方案 你是想在表格的当前列中换行显示吗? 可以

在windows窗体应用中,如何用TreeView控件解析JSON内容

问题描述 将JSON中的数据解析到这个控件中,JSON中的几组数据如下:[{"floors":[{"map":"f1-123.png","name":"test","floor":"1"}],"name":"test","id":"852801"},{"floors":

java-Android中关于读取JSON数组的问题

问题描述 Android中关于读取JSON数组的问题 我在读取一个JSON数组: JSONArray jArray = new JSONArray(jsonString); System.out.println(""*****JARRAY*****""+jArray.length()); for(int i=0;i<jArray.length();i++){ JSONObject json_data = jArray.getJSONObject(i); Log

编码-golang中服务器获得json字符串格式不对

问题描述 golang中服务器获得json字符串格式不对 我发送的是{""userName"":""huloixia""userPass"":""030719""}而服务器得到的却是%7B%22userName%22%3A%22huloixia%22%2C%22userPass%22%3A%22030719%22%7D& 我不知道什么方法可以再编码回来 解决方

C#中如何解决JSON / XML互转的问题

最近在一个POC的项目中要用到JSON和XML的相互转换, 虽然我知道很多类库如JSON.NET具备这种功 能, 但是我还是另辟蹊径的使用Spider Studio结合一个在线工具网站快速实现了这个功能. 在线工具网站: http://www.utilities-online.info/xmltojson 必备工具: Spider Studio (采集工作站): http://www.gdtsearch.com/products.spiderstudio.htm 1. 打开Spider Stud

将指定目录的结构装入TreeView中

TreeView组件是一个树状的列表组件,它在应用程序的编写中有极其广泛的应用.如:资源管理器.网际快车(FlashGet).FoxMail等,其中,Windows的资源管理器就是一个典型的例子. 在C++ Builder中,要使用TreeView组件是件很容易的事情,只要调用TreeView组件的Add或AddChild方法就可以很方便地为TreeView添加一个新的节点.若要将指定的磁盘或目录的树状结构放到TreeView组件中,可以使用遍历目录树的方法将指定磁盘或目录下的所有目录(包括子目

遍历和查找外部程序Tree-View中的项目

<金山词霸2002>中的附录收集了很多古诗,有时为了寻找一篇古诗,得找很久很久(俺文科很差).观察其附录的结构,发现是个Tree-View控件,如果能查找里面的项目该有多好. 要查找首先得遍历,连范围都确定不好何谈查找?所以本篇分两部分进行讲解:第一部分解决遍历的问题:第二部分解决查找指定项目的问题. 第一部分:遍历外部程序Tree-View中的项目 一:程序说明: 如图一所示Tree-View控件的典型结构图,我们将按照图示的顺序来遍历其中的项目. 图一 翻阅SDK手册中关于Tree-Vie