首先,介绍一下Json字串,以下Json的介绍引用网上资料。
简单地说,JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪,但是 JavaScript 很容易解释它,而且 JSON 可以表示比"名称 / 值对"更复杂的结构。例如,可以表示数组和复杂的对象,而不仅仅是键和值的简单列表。
基础示例
简单地说,JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪,但是 JavaScript 很容易解释它,而且 JSON 可以表示比"名称 / 值对"更复杂的结构。例如,可以表示数组和复杂的对象,而不仅仅是键和值的简单列表。
表示名称 / 值对
按照最简单的形式,可以用下面这样的 JSON 表示"名称 / 值对":
{ "firstName": "Brett" }
这个示例非常基本,而且实际上比等效的纯文本"名称 / 值对"占用更多的空间:
firstName=Brett
但是,当将多个"名称 / 值对"串在一起时,JSON 就会体现出它的价值了。首先,可以创建包含多个"名称 / 值对"的 记录,比如:
{ "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" }
从语法方面来看,这与"名称 / 值对"相比并没有很大的优势,但是在这种情况下 JSON 更容易使用,而且可读性更好。例如,它明确地表示以上三个值都是同一记录的一部分;花括号使这些值有了某种联系。
表示数组
当需要表示一组值时,JSON 不但能够提高可读性,而且可以减少复杂性。例如,假设您希望表示一个人名列表。在 XML 中,需要许多开始标记和结束标记;如果使用典型的名称 / 值对(就像在本系列前面文章中看到的那种名称 / 值对),那么必须建立一种专有的数据格式,或者将键名称修改为 person1-firstName这样的形式。
如果使用 JSON,就只需将多个带花括号的记录分组在一起:
{ "people": [
{ "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" },
{ "firstName": "Jason", "lastName":"Hunter", "email": "bbbb"},
{ "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" }
]}
这不难理解。在这个示例中,只有一个名为 people的变量,值是包含三个条目的数组,每个条目是一个人的记录,其中包含名、姓和电子邮件地址。上面的示例演示如何用括号将记录组合成一个值。当然,可以使用相同的语法表示多个值(每个值包含多个记录):
{ "programmers": [
{ "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" },
{ "firstName": "Jason", "lastName":"Hunter", "email": "bbbb" },
{ "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" }
],
"authors": [
{ "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" },
{ "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },
{ "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" }
],
"musicians": [
{ "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },
{ "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }
] }
这里最值得注意的是,能够表示多个值,每个值进而包含多个值。但是还应该注意,在不同的主条目(programmers、authors 和 musicians)之间,记录中实际的名称 / 值对可以不一样。JSON 是完全动态的,允许在 JSON 结构的中间改变表示数据的方式。
在处理 JSON 格式的数据时,没有需要遵守的预定义的约束。所以,在同样的数据结构中,可以改变表示数据的方式,甚至可以以不同方式表示同一事物。
总的来说,Json有两种结构:
1. Name/Value pair 的集合(Collection of Name-Value pairs)。每个pair的name与value用【:】分隔;每个Name/Value pair 用【,】分隔;Name/Value pair 的集合的以【{}】作为开始与结束。
2. Value 的有序列表(List of many Values)。每个Value用【,】分隔,Value的有序列表以【[]】作为开始与结束。
上面两种结构可以互相嵌套。如上面的例子中,大的集合中包含了三个Name/Value pair,即{"People : value1", "authors" : "value2", "musicians" : "value3"} 。其中Value1, Value2, Value3又分别是一个Value的有序列表。列表中的每个Value元素又是Name/Value pair 的集合。例如Value1的列表中第一个Value元素是三个Name/Value pair的集合,即{ "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" } 以【,】分隔后,第二个Value元素又是一个Name/Value pair的集合,即{ "firstName": "Jason", "lastName":"Hunter", "email": "bbbb"} 以【,】分隔后,第三个Value元素又是一个Name/Value pair的集合,即{ "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" } 。至此"People : value1" 的Name/Value pair结束,以【,】分隔是第二个Name/Value pair,即"authors" : "value2"
如此嵌套 ..
研究了一下.Net解析Json文件。发现比较常用的是引用NewtonSoft.dll来完成。NewtonSoft的下载地址: http://james.newtonking.com/json
假设有如下的Json字串:
{"Conditions":[{"CompareOperator":0,"CompareValue":"Live","DimensionId":"VideoMode"},{"CompareOperator":0,"CompareValue":"广东","DimensionId":"GeoId"}],"QueryViewportKey":"Geo_Query"}
1) 写一个转化类
private class FilterResult { public List<Condition> Conditions { get; set; } public string QueryViewportKey { get; set; } } private class Condition { public string CompareOperator { get; set; } public string CompareValue { get; set; } public string DimensionId { get; set; } }
2)使用
FilterResult _filterResult = new FilterResult(); _filterResult = JsonConvert.DeserializeObject<FilterResult>(filterExpression);
Console.WriteLine(_filterResult.QueryViewportKey)
foreach (Condition condition in _filterResult.Conditions)
Console.WriteLine(Condition.CompareOperator + " " + Condition.CompareValue + " " + Condition.DimensionId)