zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    js验证数字
    两个数组的交集 II---简单
    只出现一次的数字---简单
    存在重复---简单
    旋转数组---简单
    买股票的最佳时机 II---简单
    从排序数组中删除重复项---简单
    开始日常一题leetcode
    第二章 Internet地址结构
    2.2线程
  • 原文地址:https://www.cnblogs.com/yisss/p/3460105.html
Copyright © 2011-2022 走看看