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)
  • 相关阅读:
    Codeforces Round #344 (Div. 2) C. Report 其他
    Codeforces Round #344 (Div. 2) B. Print Check 水题
    Codeforces Round #344 (Div. 2) A. Interview 水题
    8VC Venture Cup 2016
    CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂 中二版
    CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂
    CDOJ 1279 班委选举 每周一题 div2 暴力
    每周算法讲堂 快速幂
    8VC Venture Cup 2016
    Educational Codeforces Round 9 F. Magic Matrix 最小生成树
  • 原文地址:https://www.cnblogs.com/yisss/p/3460105.html
Copyright © 2011-2022 走看看