WPF:使用Json.NET在TreeView中树形显示JSON数据-阿里云开发者社区

开发者社区> 杰克.陈> 正文

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

简介: 原文  WPF:使用Json.NET在TreeView中树形显示JSON数据 据 读者可以参考这个开源的可以树形显示XML和JSON的工具: Mgen Object 603:XML/JSON树形显示小工具 或者一个更大的开源工程(构建和分析HTTP并支持XML及JSON的树形显示): Mgen Bluckbadda   效果如下: (每一个项目中的左侧黑字是数据的值,右侧灰字是数据的类型。
+关注继续查看

原文 

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

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

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

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

Mgen Bluckbadda

 

效果如下:

image

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

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

 

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

image

 

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 使用 Edge 浏览器
原文:WPF 使用 Edge 浏览器 本文告诉大家如何使用 Windows Community Toolkit 的新控件,在 WPF 使用 Edge 浏览器 首先需要通过 VisualStudio 创建 WPF 项目。
1037 0
WPF:使用Json.NET在TreeView中树形显示JSON数据
原文  WPF:使用Json.NET在TreeView中树形显示JSON数据 据 读者可以参考这个开源的可以树形显示XML和JSON的工具: Mgen Object 603:XML/JSON树形显示小工具 或者一个更大的开源工程(构建和分析HTTP并支持XML及JSON的树形显示): Mgen Bluckbadda   效果如下: (每一个项目中的左侧黑字是数据的值,右侧灰字是数据的类型。
1664 0
git使用第一天,新建分支(sourceTree)
新建分支 1、打开git [图片上传中。。。(1)] 2.点击 git工作流 [图片上传中。。。(2)] 3.选择其他操作——建立功能 [图片上传中。
839 0
WPF数据绑定点滴1,2,3
在WPF程序设计中数据绑定非常常用,这个功能使用得当可以大幅的简化程序逻辑,提高效率,如下根据使用中的情况简要做了总结。 概念 数据绑定发生在源对象和目标对象之间,当源对象或目标对象的属性值发生改变时,所绑定的对象也会跟着发生改变          * 数据绑定的目标对象一定是Dependenc...
594 0
WPF入门:数据绑定
原文:WPF入门:数据绑定 上一篇我们将XAML大概做了个了解 ,这篇将继续学习WPF数据绑定的相关内容 数据源与控件的Binding Binding作为数据传送UI的通道,通过INotityPropertyChanged接口的PropertyChanged事件通知Binding数据属性...
858 0
+关注
杰克.陈
一个安静的程序猿~
10427
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载