65.9K
CodeProject 正在变化。 阅读更多。
Home

JSON 查看器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.90/5 (16投票s)

2013年8月1日

CPOL

3分钟阅读

viewsIcon

98280

downloadIcon

6052

在本文中,我将解释我是如何使用 System.Web.Extensions.dll 和 JavaScriptSerializer 类开发一个简单的 JSON 数据查看器的。

引言

作为一名 Web 开发者,我几乎总是与 JSON 数据打交道。大多数时候,我可以查看数据并很好地理解正在发生的事情,如果需要,我只需将其通过一个 JSON 解码脚本(通常在 PHP 中)运行。但最近,我收到一个大型 JSON 文件,最初是来自网站的 Ajax 响应。通常,我会编写一个简单的脚本来使数据更具可读性,但在最近的一个 .NET Web 应用程序中使用了 JavaScriptSerializer 类后,我很好奇开发一个 Windows 应用程序来解码 JSON 数据并以更有意义的方式呈现给我会有多困难。

自从我从事 Windows Forms 应用程序开发以来已经有一段时间了,我立刻遇到一个问题。出于某种原因,我无法添加对 System.Web.Extensions 的引用。 “添加引用”对话框中没有列出该引用。经过一段时间的头撞和沮丧之后,我意识到这与目标框架有关。我的应用程序的目标是 .NET Framework 4 客户端配置文件。我将其切换为使用 .NET Framework 4,并再次检查了引用列表。从那一刻起,头撞停止了。

现在我能够添加引用了,我可以使用 System.Web.Script.Serialization 命名空间。在此命名空间中,有一个名为 JavaScriptSerializer 的类。它有一个 Deserialize 方法,可以将 JSON 数据反序列化为 Type。我使用 Dictionary 类型,因为 JSON 可以被认为是一个键/值对,其中值也可以是一个数组。下面的列表 1.1 显示了来自示例应用程序的反序列化过程的摘录。

列表 1.1

.......
JavaScriptSerializer js = new JavaScriptSerializer();
 
try
{
	Dictionary<string,> dic = js.Deserialize<dictionary<string,>>(txtInput.Text);
 
	TreeNode rootNode = new TreeNode("Root");
	jsonExplorer.Nodes.Add(rootNode);
	BuildTree(dic, rootNode);
}
catch (ArgumentException argE)
{
	MessageBox.Show("JSON data is not valid");
} 

一旦我反序列化了数据,我需要一种显示它的方法。为此,我选择使用 TreeView 控件,其中 TreeNode 可以同时表示键和值。请注意,在上面的代码中,我有一个方法 BuildTree(),它接受一个 Dictionary 对象和一个 TreeNode。此方法递归地循环遍历每个项目,并检查该值是否为 Type Dictionary 类型,如果是,则将新的 Dictionary 对象传递给自身(BuildTree),并带有父 TreeNode

如果该值不是 Dictionary 类型,那么我检查它是否为 ArrayList 类型,如果是,则循环遍历这些项目并将它们添加为最终的 TreeNode。最后,如果该值既不是 Dictionary 也不是 ArrayList 类型,那么我假设它是一个 string 并创建一个最终的 TreeNode。我为每个最终的 TreeNode 值赋予蓝色文本颜色,以表明它不是父 TreeNode

下面的列表 1.2 显示了完整的 BuildTree 方法。

列表 1.2

public void BuildTree(Dictionary<string,> dictionary, TreeNode node)
{
	foreach (KeyValuePair<string,> item in dictionary)
	{
		TreeNode parentNode = new TreeNode(item.Key);
		node.Nodes.Add(parentNode);
 
		try
		{
			dictionary = (Dictionary<string,>)item.Value;
			BuildTree(dictionary, parentNode);
		}
		catch (InvalidCastException dicE) {
			try
			{
				ArrayList list = (ArrayList)item.Value;
				foreach (string value in list)
				{
					TreeNode finalNode = new TreeNode(value);
					finalNode.ForeColor = Color.Blue;
					parentNode.Nodes.Add(finalNode);
				}
				
			}
			catch (InvalidCastException ex)
			{
				TreeNode finalNode = new TreeNode(item.Value.ToString());
				finalNode.ForeColor = Color.Blue;
				parentNode.Nodes.Add(finalNode);
			}
		}
	}
}

应用程序的其余部分由使用 OpenFileDialog 类和 System.IO 命名空间 读取文件组成。

历史

  • 2013 年 8 月 1 日:初始版本
© . All rights reserved.