1. 程式人生 > >Json介紹及Jsoncpp簡單使用(測試程式碼+測試例項)

Json介紹及Jsoncpp簡單使用(測試程式碼+測試例項)

Json介紹及Jsoncpp簡單使用

Json介紹
JSON是一種輕量級的資料交換格式。易於人閱讀和編寫。同時也易於機器解析和生成。它基於JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集。 JSON採用完全獨立於語言的文字格式,但是也使用了類似於C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使JSON成為理想的資料交換語言。
JSON建構於兩種結構:

  • “名稱/值”對的集合(A collection of name/value pairs)。不同的語言中,它被理解為物件(object),紀錄(record),結構(struct),字典(dictionary),雜湊表(hash table),有鍵列表(keyed list),或者關聯陣列 (associative array)。
  • 值的有序列表(An ordered list of values)。在大部分語言中,它被理解為陣列(array)。

這些都是常見的資料結構。事實上大部分現代計算機語言都以某種形式支援它們。這使得一種資料格式在同樣基於這些結構的程式語言之間交換成為可能。
JSON具有以下這些形式:

物件是一個無序的“‘名稱/值’對”集合。一個物件以“{”(左括號)開始,“}”(右括號)結束。每個“名稱”後跟一個“:”(冒號);“‘名稱/值’ 對”之間使用“,”(逗號)分隔。

這裡寫圖片描述

陣列是值(value)的有序集合。一個數組以“[”(左中括號)開始,“]”(右中括號)結束。值之間使用“,”(逗號)分隔。
這裡寫圖片描述

值(value)可以是雙引號括起來的字串(string)、數值(number)、true、false、 null、物件(object)或者陣列(array)。這些結構可以巢狀。

這裡寫圖片描述

字串(string)是由雙引號包圍的任意數量Unicode字元的集合,使用反斜線轉義。一個字元(character)即一個單獨的字串(character string)。

這裡寫圖片描述

數值(number)也與C或者Java的數值非常相似。除去未曾使用的八進位制與十六進位制格式。除去一些編碼細節。

這裡寫圖片描述

空白可以加入到任何符號之間。下面為一個Json資料

{
    "object1
": { "number": 3, "string": "This is string", "double": 1.001, "array": [ { "number": -111, "string": "first string" }, { "number": 2, "string": "這是一個字串" } ] }, "object2": { "number1": 30, "number2": 70 }, "number" : 10 }

此資料有如下特點:

  • 此結構任意一個節點為可以key:value對,此處的value可能為string、number、array、object;
  • 此結構有較好的可讀性,易維護;
  • 此結構可作為BS架構之間的互動資料格式;
  • 此結構易拓展,不改變原有結構基礎上,任意新增欄位,一般不會引起相容性問題;

Json值與C++值之間的轉換
C++的值轉換為Json值時,呼叫了Json的各種建構函式和拷貝建構函式;而Json值轉換為C++值時,需要呼叫專門的介面函式。

  • 使用C++中的std::string,const char*型別的值可以和Json的string值相互轉換;
  • C++的bool或float等標量型別值可以和Json的number或bool值相互轉換,只有一個條件就是轉換時不能降低精度或丟失資料;
  • 同時可以將一個null型別的Json值轉換成所有支援的C++型別(轉為std::string型別時,返回的內容為”“;轉換成const char*型別時,返回的是空指標;轉換為標量型別時,返回的值是0;轉換成布林型別時,返回的值是false);
  • Json中的object型別和array型別是不能轉換為C++值的;
  • array型別可以通過陣列下標形式訪問每一個獨立的value值,在根據上述原則迭代轉換
  • object型別可以通過詳細的key值訪問

Jsoncpp使用

ps:後續補上Jsoncpp原始碼分析。