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">

               

               <TextBlock Text="{Binding Header}"/>

               

               <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 = "";

   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

目录
相关文章
|
3月前
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
47 1
|
2月前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
20天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
23天前
|
JSON 缓存 前端开发
PHP如何高效地处理JSON数据:从编码到解码
在现代Web开发中,JSON已成为数据交换的标准格式。本文探讨了PHP如何高效处理JSON数据,包括编码和解码的过程。通过简化数据结构、使用优化选项、缓存机制及合理设置解码参数等方法,可以显著提升JSON处理的性能,确保系统快速稳定运行。
|
2月前
|
SQL XML 关系型数据库
入门指南:利用NHibernate简化.NET应用程序的数据访问
【10月更文挑战第13天】NHibernate是一个面向.NET的开源对象关系映射(ORM)工具,它提供了从数据库表到应用程序中的对象之间的映射。通过使用NHibernate,开发者可以专注于业务逻辑和领域模型的设计,而无需直接编写复杂的SQL语句来处理数据持久化问题。NHibernate支持多种数据库,并且具有高度的灵活性和可扩展性。
40 2
|
17天前
|
JSON API 数据安全/隐私保护
拍立淘按图搜索API接口返回数据的JSON格式示例
拍立淘按图搜索API接口允许用户通过上传图片来搜索相似的商品,该接口返回的通常是一个JSON格式的响应,其中包含了与上传图片相似的商品信息。以下是一个基于淘宝平台的拍立淘按图搜索API接口返回数据的JSON格式示例,同时提供对其关键字段的解释
|
2月前
|
JSON JavaScript Java
在Java中处理JSON数据:Jackson与Gson库比较
本文介绍了JSON数据交换格式及其在Java中的应用,重点探讨了两个强大的JSON处理库——Jackson和Gson。文章详细讲解了Jackson库的核心功能,包括数据绑定、流式API和树模型,并通过示例演示了如何使用Jackson进行JSON解析和生成。最后,作者分享了一些实用的代码片段和使用技巧,帮助读者更好地理解和应用这些工具。
在Java中处理JSON数据:Jackson与Gson库比较
|
2月前
|
JSON JavaScript API
(API接口系列)商品详情数据封装接口json数据格式分析
在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦!
|
2月前
|
JSON 前端开发 Java
【Spring】“请求“ 之传递 JSON 数据
【Spring】“请求“ 之传递 JSON 数据
87 2
|
3月前
|
存储 JSON Go
在Gin框架中优雅地处理HTTP请求体中的JSON数据
在Gin框架中优雅地处理HTTP请求体中的JSON数据
下一篇
无影云桌面