Json介绍以及解析Json

首先,介绍一下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)

 

posted @ 2013-12-05 17:54  Yisss  阅读(568)  评论(0编辑  收藏  举报