整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          JAVA實(shí)現(xiàn)生成多層JSON格式數(shù)據(jù)(含源碼-三層樣

          JAVA實(shí)現(xiàn)生成多層JSON格式數(shù)據(jù)(含源碼-三層樣例)

          SON

          JSON(JavaScriptObject Notation, JS 對(duì)象標(biāo)記) 是一種輕量級(jí)的數(shù)據(jù)交換格式。它基于ECMAScript規(guī)范的一個(gè)子集,采用完全獨(dú)立于編程語(yǔ)言的文本格式來(lái)存儲(chǔ)和表示數(shù)據(jù)。簡(jiǎn)潔和清晰的層次結(jié)構(gòu)使得 JSON 成為理想的數(shù)據(jù)交換語(yǔ)言。 易于人閱讀和編寫,同時(shí)也易于機(jī)器解析和生成,并有效地提升網(wǎng)絡(luò)傳輸效率。

          下面java生成JSON數(shù)據(jù)

          import net.sf.json.JSONArray;

          import net.sf.json.JSONObject;

          public class CopyOfJsonTest {

          /**

          * 生成多層json格式數(shù)據(jù)

          * 2017年4月28日 14:53:21

          * @param args

          */

          public static void main(String[] args) {

          JSONArray jsArray=new JSONArray();

          JSONObject j3=new JSONObject();

          j3.put(第三層1, 1);

          j3.put(第三層2, 2);

          j3.put(第三層3, 3);

          jsArray.add(j3);

          JSONArray jsArra2=new JSONArray();

          JSONObject j2=new JSONObject();

          j2.put(第二層1, 1);

          j2.put(第二層2, 2);

          j2.put(第二層3, jsArray);

          jsArra2.add(j2);

          JSONObject j1=new JSONObject();

          j1.put(第一層1, 1);

          j1.put(第一層2, j2);

          j1.put(第一層3, jsArra2);

          System.out.println(j1.toString());

          }

          }

          打印出的數(shù)據(jù)格式是

          感謝大家關(guān)注

          “點(diǎn)讀微訊”

          . JSON 是什么?

          • JSON 指的是 JavaScript 對(duì)象表示法(JavaScript Object Notation)
          • JSON 是輕量級(jí)的文本數(shù)據(jù)交換格式
          • JSON 獨(dú)立于語(yǔ)言:JSON 使用 Javascript語(yǔ)法來(lái)描述數(shù)據(jù)對(duì)象,但是 JSON 仍然獨(dú)立于語(yǔ)言和平臺(tái)。JSON 解析器和 JSON 庫(kù)支持許多不同的編程語(yǔ)言。 目前非常多的動(dòng)態(tài)(PHP,JSP,.NET)編程語(yǔ)言都支持JSON。
          • JSON 具有自我描述性,更易理解

          2. JSON 的語(yǔ)法規(guī)則是怎樣的?

          • JSON 語(yǔ)法是 JavaScript 對(duì)象表示語(yǔ)法的子集。
            • 數(shù)據(jù)在名稱/值對(duì)中
            • 數(shù)據(jù)由逗號(hào)分隔
            • 大括號(hào) {} 保存對(duì)象
            • 中括號(hào) [] 保存數(shù)組,數(shù)組可以包含多個(gè)對(duì)象
          {
              "name": "xdr630",
              "favorite": "programming"
          }

          3. JSON 和 XML

          JSON常被拿來(lái)與XML做比較,因?yàn)镴SON 的誕生本來(lái)就多多少少要有取代XML的意思。相比 XML,JSON的優(yōu)勢(shì)如下:

          • 沒有結(jié)束標(biāo)簽,長(zhǎng)度更短,讀寫更快
          • 能夠直接被JavaScript解釋器解析
          • 可以使用數(shù)組

          兩者比較

          • JSON:
          {
              "name":"兮動(dòng)人",
              "age":22,
              "fruits":["apple","pear","grape"]
          }
          • XML:
          <root>
              <name>兮動(dòng)人</name>
              <age>22</age>
              <fruits>apple</fruits>
              <fruits>pear</fruits>
              <fruits>grape</fruits>
          </root>

          4. JSON的解析和生成(JSON 和 JS 對(duì)象互轉(zhuǎn))

          • 在JavaScript中,有兩個(gè)方法與此相關(guān): JSON.parseJSON.stringify
            JSON 和 JS 對(duì)象互轉(zhuǎn)
          1. 要實(shí)現(xiàn)從JSON字符串轉(zhuǎn)換為JS對(duì)象,使用 JSON.parse() 方法:
          <script>
              var str='{"name": "兮動(dòng)人","age":22}';
              var obj=JSON.parse(str);
              console.log(obj);
          </script>

          要實(shí)現(xiàn)從JS對(duì)象轉(zhuǎn)換為JSON字符串,使用 JSON.stringify() 方法:

          <script>
              var str='{"name": "兮動(dòng)人","age":22}';
              var obj=JSON.parse(str);
              console.log(obj);
              var jsonstr=JSON.stringify(obj);
              console.log(jsonstr);
          </script>

          5、JSON格式規(guī)定

          5.1、對(duì)象(0bject)

          對(duì)象用大括號(hào)(“{}”)括起來(lái),大括號(hào)里是一系列的“名稱/值對(duì)”,請(qǐng)看概念圖。

          兩個(gè)并列的數(shù)據(jù)之間用逗號(hào)(“,”)隔開,注意兩點(diǎn):

          使用英文的逗號(hào)(“,”),不要用中文的逗號(hào)(“”)

          最后一個(gè)“名稱/值對(duì)“之后不要加逗號(hào)

          5.2、數(shù)組(Array)

          • 數(shù)組表示一系列有序的值,用方括號(hào)(“[]”)包圍起來(lái),并列的值之間用逗號(hào)分隔,請(qǐng)看概念圖。

          例如,以下的數(shù)組是合法的:

          [1,2,"three","four",true,false,null,[1,2],{"name":"兮動(dòng)人"}]

          5.3、名稱/值對(duì)(Name/Value)

          • 名稱(Name)是一個(gè)字符串,要用雙引號(hào)括起來(lái),不能用單引號(hào)也不能沒有引號(hào),這一點(diǎn)與JavaScript不同。
          • 值的類型只有七種:字符串(string)、數(shù)值(number)、對(duì)象(object)、數(shù)組(array), true、false、null不能有這之外的類型,例如undefined、函數(shù)等。請(qǐng)看概念圖。

          字符串(string)的規(guī)則如下:

          1. 英文雙引號(hào)括起來(lái),不能用單引號(hào),也不能沒有。
          2. 字符串中不能單獨(dú)出現(xiàn)雙引號(hào)()和右斜杠(“\“)。
          3. 如果要打雙引號(hào)或右斜杠,需要使用“右斜杠+字符”的形式,例如\”\,其它的轉(zhuǎn)義字符也是如此字符串的概念圖。

          6、字符串轉(zhuǎn)化成對(duì)象



          • 解析:是指將符合JSON 語(yǔ)法規(guī)則的字符串轉(zhuǎn)換成對(duì)象的過程。
          • 不同的編程語(yǔ)言都提供了解析JSON字符串的方法,在這里主要講解JavaScript中的解析方法。主要有三種:
          1. 使用eval()
          2. 使用JSON.parse()
          3. 使用第三方庫(kù),例如JQuery等

          6.1、 eval()

          • eval()函數(shù)的參數(shù)是一個(gè)字符串,其作用是直接執(zhí)行其中的 JavaScript代碼。

          案例:eval()解析字符串

          <script>
            var str="console.log('hello')";
            eval(str);
          </script>
          • eval 解析字符串的結(jié)果:

          • eval()能夠解析JSON字符串。從這里也可以看得出,JSON 和JavaScript是高度嵌合的。
          • 案例:eval()解析JSON字符串
          <script>
            var str='{"name":"兮動(dòng)人","age":22}';
            var obj=eval("("+str+")");
            console.log(obj)
          </script>
          • 但是,現(xiàn)在已經(jīng)很少直接使用eval()來(lái)解析了,如果您的瀏覽器版本真的是很舊,可能才需要這個(gè)方法。此外,eval()是一個(gè)相對(duì)危險(xiǎn)的函數(shù),因?yàn)樽址锌赡芎形粗蛩亍T谶@里,作為學(xué)習(xí),還是要知道這也是一種方法。
          • 請(qǐng)注意 eval()的參數(shù),在字符串兩旁加了括號(hào),這是必須的,否則會(huì)報(bào)錯(cuò)。
          • 因?yàn)镴SON字符串是被大括號(hào)(“{}”)包圍的,直接放到 eval()會(huì)被當(dāng)成語(yǔ)句塊來(lái)執(zhí)行,因此要在兩旁加上括號(hào),使其變成表達(dá)式。

          6.2、JSON. parse()

          • 現(xiàn)在絕大多數(shù)瀏覽器都以支持JSON.parse()是推薦使用的方式
          • 如果輸入了不符合規(guī)范的字符串,會(huì)報(bào)錯(cuò)。

          案例:JSON字符串轉(zhuǎn)換為JS對(duì)象

          <script>
              var str='{"name":"兮動(dòng)人","age":22}';
              var obj=JSON.parse(str)
              console.log(obj)
          </script>

          • JSON.parse()可以有第二個(gè)參數(shù),是一個(gè)函數(shù)。此函數(shù)有兩個(gè)參數(shù):name和value,分別代表名稱和值。當(dāng)傳入一個(gè)JSON字符串后,JSON的每一組名稱/值對(duì)都要調(diào)用此函數(shù)。該函數(shù)有返回值,返回值將賦值給當(dāng)前的名稱(name)。
          • 利用第二個(gè)參數(shù),可以在解析JSON字符串的同時(shí)對(duì)數(shù)據(jù)進(jìn)行一些處理。

          案例:

          <script>
              var str='{"name":"兮動(dòng)人","age":22}';
              var obj=JSON.parse(str,fun);
              function fun(name,value){
                  console.log(name+":"+value);
                  return value
              }
              console.log(obj)
          </script>

          可以做判斷處理,當(dāng)JSON字符串的 name=age 時(shí),設(shè)置age的value=14

          ML 曾經(jīng)是各種應(yīng)用的配置和傳輸?shù)氖走x方式。但是現(xiàn)在 XML 遇到了一個(gè)強(qiáng)勁的對(duì)手:JSON。我們可以在這里看到有關(guān) JSON 的語(yǔ)法。總體來(lái)說,JSON 的數(shù)據(jù)比 XML 更緊湊,在傳輸效率上也要優(yōu)于 XML。不過 JSON 數(shù)據(jù)的層次化表達(dá)不及 XML,至少不如 XML 那樣突出。不過這并不會(huì)阻止 JSON 的廣泛應(yīng)用。

          一個(gè)典型的 JSON 文檔可以像下面的例子:

          {
            "encoding" : "UTF-8",
            "plug-ins" : [
                "python",
                "c++",
                "ruby"
                ],
            "indent" : { "length" : 3, "use_space" : true }
          }

          JSON 的全稱是 JavaScript Object Notation,與 JavaScript 密不可分。熟悉 JavaScript 的童鞋馬上就會(huì)發(fā)現(xiàn),JSON 的語(yǔ)法就是 JavaScript 對(duì)象聲明的語(yǔ)法。JSON 文檔其實(shí)就是一個(gè) JavaScript 對(duì)象,因而也稱為 JSON 對(duì)象,以大括號(hào)作為起止符,其實(shí)質(zhì)是不排序的鍵值對(duì),其中鍵要求是 string 類型,值可以是任意類型。比如上面的示例,鍵 encoding 的值是字符串 UTF-8;鍵 plug-ins 的值是一個(gè)數(shù)組類型,在 JSON 中,數(shù)組以中括號(hào)表示,這個(gè)數(shù)組是一個(gè)字符串列表,分別有 python、c++ 和 ruby 三個(gè)對(duì)象;鍵 indent 的值是一個(gè)對(duì)象,這個(gè)對(duì)象有兩個(gè)屬性,length=3,use_space=true。

          對(duì)于 JSON 的解析,我們可以使用 QJson 這個(gè)第三方庫(kù)。QJson 可以將 JSON 數(shù)據(jù)轉(zhuǎn)換為 QVariant 對(duì)象,將 JSON 數(shù)組轉(zhuǎn)換成 QVariantList 對(duì)象,將 JSON 對(duì)象轉(zhuǎn)換成 QVariantMap 對(duì)象。我們?cè)谶@里使用 git clone 出 QJson 的整個(gè)代碼。注意 QJson 沒有提供鏈接庫(kù)的 pro 文件,因此我們只需要將所有源代碼文件添加到我們的項(xiàng)目即可(如同這些文件是我們自己寫的一樣)。接下來(lái)就可以使用 QJson 讀取 JSON 內(nèi)容:

          #include "parser.h"
          //////////
          QJson::Parser parser;
          bool ok;
          
          QString json("{"
                  "\"encoding\" : \"UTF-8\","
                  "\"plug-ins\" : ["
                  "\"python\","
                  "\"c++\","
                  "\"ruby\""
                  "],"
                  "\"indent\" : { \"length\" : 3, \"use_space\" : true }"
                  "}");
          QVariantMap result=parser.parse(json.toUtf8(), &ok).toMap();
          if (!ok) {
              qFatal("An error occurred during parsing");
              exit (1);
          }
          
          qDebug() << "encoding:" << result["encoding"].toString();
          qDebug() << "plugins:";
          
          foreach (QVariant plugin, result["plug-ins"].toList()) {
              qDebug() << "\t-" << plugin.toString();
          }
          
          QVariantMap nestedMap=result["indent"].toMap();
          qDebug() << "length:" << nestedMap["length"].toInt();
          qDebug() << "use_space:" << nestedMap["use_space"].toBool();

          將 JSON 對(duì)象轉(zhuǎn)換成 QVariant 對(duì)象很簡(jiǎn)單,基本只需要下面幾行:

          // 1. 創(chuàng)建 QJson::Parser 對(duì)象
          QJson::Parser parser;
          
          bool ok;
          // 2. 將 JSON 對(duì)象保存在一個(gè)對(duì)象 json 中,進(jìn)行數(shù)據(jù)轉(zhuǎn)換
          QVariant result=parser.parse (json, &ok);

          QJson::Parser::parse() 函數(shù)接受兩個(gè)參數(shù),第一個(gè)參數(shù)是 JSON 對(duì)象,可以是 QIODevice * 或者是 QByteArray;第二個(gè)參數(shù)是轉(zhuǎn)換成功與否,如果成功則被設(shè)置為 true。函數(shù)返回轉(zhuǎn)換后的 QVariant 對(duì)象。注意我們轉(zhuǎn)換后的對(duì)象其實(shí)是一個(gè) QVariantMap 類型,可以像 QMap 一樣使用重載的 [] 獲取鍵所對(duì)應(yīng)的值。另外,由于 result [“plug-ins”] 是一個(gè) QVariantList 對(duì)象(因?yàn)槭怯?JSON 數(shù)組返回的),因而可以調(diào)用其 toList() 函數(shù),通過遍歷輸出每一個(gè)值。

          【領(lǐng)QT開發(fā)教程學(xué)習(xí)資料,點(diǎn)擊下方鏈接莬費(fèi)領(lǐng)取↓↓,先碼住不迷路~】

          點(diǎn)擊→領(lǐng)取Qt開發(fā)(視頻教程+文檔+代碼+項(xiàng)目實(shí)戰(zhàn))

          如果需要將 QVariant 生成 JSON 對(duì)象,我們則使用 QJson::Serializer 對(duì)象。例如:

          QVariantList people;
          
          QVariantMap bob;
          bob.insert("Name", "Bob");
          bob.insert("Phonenumber", 123);
          
          QVariantMap alice;
          alice.insert("Name", "Alice");
          alice.insert("Phonenumber", 321);
          
          people << bob << alice;
          
          QJson::Serializer serializer;
          bool ok;
          QByteArray json=serializer.serialize(people, &ok);
          
          if (ok) {
              qDebug() << json;
          } else {
              qCritical() << "Something went wrong:" << serializer.errorMessage();
          }

          QJson::Serializer 和前面的 QJson::Parser 的用法相似,只需要調(diào)用 QJson::Serializer::serialize() 即可將 QVariant 類型的數(shù)據(jù)轉(zhuǎn)換為 JSON 格式。其返回值是 QByteArray 類型,可以用于很多其它場(chǎng)合。

          上面是 QJson 的主要使用方法。其實(shí) QJson 還提供了另外一個(gè)類 QObjectHelper,用于 QVariant 和 QObject 之間的轉(zhuǎn)換。注意我們上面所說的 QJson 的轉(zhuǎn)換需要的是 QVariant 類型的數(shù)據(jù),無(wú)論是轉(zhuǎn)換到 JSON 還是從 JSON 轉(zhuǎn)換而來(lái)。但是通常我們?cè)趹?yīng)用程序中使用的是 QObject 及其子類。QObjectHelper 提供了一個(gè)工具函數(shù),完成 QVariant 和 QObject 之間的轉(zhuǎn)換。例如我們有下面的類:

          class Person : public QObject
          {
            Q_OBJECT
          
            Q_PROPERTY(QString name READ name WRITE setName)
            Q_PROPERTY(int phoneNumber READ phoneNumber WRITE setPhoneNumber)
            Q_PROPERTY(Gender gender READ gender WRITE setGender)
            Q_PROPERTY(QDate brithday READ brithday WRITE setBrithday)
            Q_ENUMS(Gender)
          
            public:
              Person(QObject* parent=0);
              ~Person();
          
              QString name() const;
              void setName(const QString& name);
          
              int phoneNumber() const;
              void setPhoneNumber(const int phoneNumber);
          
              enum Gender {Male, Female};
              void setGender(Gender gender);
              Gender gender() const;
          
              QDate brithday() const;
              void setBrithday(const QDate& dob);
          
            private:
              QString m_name;
              int m_phoneNumber;
              Gender m_gender;
              QDate m_dob;
          };

          那么,我們可以使用下面的代碼將 Person 類進(jìn)行 JSON 序列化:

          Person person;
          person.setName("Flavio");
          person.setPhoneNumber(123456);
          person.setGender(Person::Male);
          person.setDob(QDate(1982, 7, 12));
          
          QVariantMap variant=QObjectHelper::qobject2qvariant(&person);
          QJson::Serializer serializer;
          qDebug() << serializer.serialize( variant);

          以及:


          主站蜘蛛池模板: 久久综合一区二区无码 | 国产一区二区免费| 精品视频一区二区观看| 精品乱码一区内射人妻无码| 性色AV 一区二区三区| 少妇无码AV无码一区| 末成年女AV片一区二区| 亚洲AV无码一区二区三区电影| 久久人妻无码一区二区| 一本岛一区在线观看不卡| 亚洲av色香蕉一区二区三区 | 日本一区二区三区不卡在线视频| 国产主播福利精品一区二区| 精品国产一区二区22| 久久无码人妻一区二区三区| 精品久久综合一区二区| 91福利国产在线观看一区二区| 蜜臀AV免费一区二区三区| 国产suv精品一区二区6| 红杏亚洲影院一区二区三区| 99精品国产高清一区二区麻豆 | 亚洲av午夜福利精品一区| 国产精品一区视频| 熟女大屁股白浆一区二区| 亚洲熟妇成人精品一区| 国产一区二区三区在线视頻 | 日本一区二区在线免费观看| 国产AV午夜精品一区二区三| 欧美亚洲精品一区二区| 综合无码一区二区三区| 亚洲无码一区二区三区| 亚洲综合av永久无码精品一区二区| 国产成人精品久久一区二区三区| 精品一区二区三区影院在线午夜 | 人妻AV一区二区三区精品| 亚洲av无码天堂一区二区三区| 激情亚洲一区国产精品| 久久久久一区二区三区| 国产一区精品视频| 亚无码乱人伦一区二区| 无码人妻少妇色欲AV一区二区|