json 형식 해석 과 libjson 의 용법 소개(cjson 의 사용 방법 에 대하 여)

본 고 를 읽 기 전에 먼저 라 는 글 을 읽 으 십시오.
Rss Reader 인 스 턴 스 개발 에서 네트워크 데이터 교환 을 할 때 주로 두 가지 데이터 형식 을 사 용 했 습 니 다.JSON 과 XML.본 고 는 주로 JSON 형식의 간단 한 개념 과 JSON 이 Rss Reader 에서 의 응용 을 소개 하고 XML 형식의 사용 은 다음 글 에서 소개 할 것 이다.
JSON 프로필:
JSON(JavaScript Object Notation)은 경량급 데이터 교환 형식 으로 JSON 의 구 조 를 무질서 하고 끼 워 넣 을 수 있 는 key-value 키 쌍 집합 으로 이해 할 수 있 으 며,이러한 key-value 키 쌍 은 구조 체 나 배열 형식 으로 구성 된다.같은 레벨 의 key-value 키 쌍 사 이 는 하나의","(쉼표)로 구분 되 며,각 key-value 키 쌍 은 하나의 key 뒤에 있 는":"(콜론)이 고,콜론 뒤 에는 이 key 에 대응 하 는 value 입 니 다.Key 는 하나의 워드 로 대소 문자,밑줄 과 숫자 로 구성 되 어 있 으 며,작은 따옴표 로 닫 을 수도 있 고,작은 따옴표 도 넣 지 않 을 수도 있다.그리고 value 의 수치 집합 은 Number,Boolean(true 또는 false),null,String,Object 와 Array 입 니 다.그림 1 참조:

(그림 1)
1.Number:수 치 는 성형 수 와 부동 소수점 을 포함한다.예 를 들 어 123,0.83,-2.7e 10.그 구 조 는 그림 2 와 같다.

(그림 2)
2.String:문자열 은 두 따옴표 로 닫 힌 문자열 입 니 다.예 를 들 어\\,등 JSON 에서 문자열 의 개념 은 C/C++또는 JAVA 언어 에서 문자열 의 개념 과 차이 가 많 지 않 습 니 다.예 를 들 어"abc"와 같 습 니 다.그 구 조 는 그림 3 과 같다.

(그림 3)
3.Object:대상 은 하나의 구조 체 로 이해 할 수 있 습 니 다.대괄호 로 닫 힌 무질서 한 key-value 키 로 집합 합 니 다.예 를 들 어{name:"Susan",age:27,birthday:{year:1984,month:2,day:11};{"name":"Susan","age":27,"birthday":{"year":1984,"month":2,"day":11}로 쓸 수도 있 습 니 다.그 구 조 는 그림 4 와 같다.

(그림 4)
4.Array:배열,JSON 의 배열 은 중 괄호 로 닫 힌 value 의 집합 입 니 다.즉,배열 안의 각 구성원 의 데이터 형식 이 다 를 수 있다 는 점 은 C/JAVA 의 배열 개념 과 다 릅 니 다.모든 value 사 이 는","(쉼표)로 구분 되 어 있 습 니 다.예 를 들 어[123,abc,false,{name:mj}];그 구 조 는 그림 5 와 같다.

(그림 5)
JSON 에 대한 자세 한 설명 과 튜 토리 얼 은 인터넷 에서 직접 검색 해 보 세 요.많 습 니 다.
다음은 우리 가 예 를 하나 쓰 자.

{

  result:true,

 

  root:{

    version:"201007091640",

    channels:[

    {

      name:"    ",

      subchnls:[

      {

        title:"    ",

        link:"http://jb51.net/news/channel/1/news.rss",

        desc:"  、  、   "

      },

      {

        title:"    ",

        link:"http://jb51.net/news/channel/2/news.rss",

        desc:"          "

      },

      {

        title:"    ",

        link:"http://jb51.net/news/channel/3/news.rss",

        desc:"  "

      }

      ]

    },

    

    {

      name:"    ",

      subchnls:[

      {

        title:"      ",

        link:"http://jb51.net/news/channel/4/news.rss",

        desc:"erewr"

      },

      {

        title:"    ",

        link:"http://jb51.net/news/channel/5/news.rss",

        desc:"werewr"

      }

      ]

    }

    

    ]

  }

}
이 JSON 은 하나의 대상(가장 바깥쪽 대괄호 로 둘러싸 인 부분)을 묘사 하 였 으 며,쉽게 구분 할 수 있 도록 대상 A 라 고 부 릅 시다.대상 A 는 두 개의 Item(즉 key-value 키 쌍)이 있 고 하 나 는 result 이 며 그 값 은 true 입 니 다.하 나 는 루트 이 고 그 값 은 대상 B 라 고 합 니 다.대상 B 도 두 개의 Item 이 있 는데 하 나 는 version 이 고 그 값 은 하나의 문자열'201007091640'이다.하 나 는 channels 이 고 그 값 은 하나의 배열 이 며 배열 의 구성원 은 모두 하나의 대상 이 며 모든 대상 은 두 개의 Item 을 포함 합 니 다.하 나 는 name 이 고 값 은 각각 문자열'뉴스 센터'와'스포츠 뉴스'입 니 다.하 나 는 subchnls 이 고 값 은 모두 배열 입 니 다.각 배열 은 각각 몇 명의 구성원 이 있 습 니 다.모든 subchnls 구성원 도 하나의 대상 이 고 모든 대상 은 세 개의 Item:title,link 와 desc 가 있 습 니 다.아마 당신 은 이것 을 보고 이미 땀 을 흘 렸 을 것 입 니 다.그러나 괜 찮 습 니 다.우 리 는 이 JSON 텍스트 에 대응 하 는 구조 도 를 붙 입 니 다.그림 이 있 으 면 진실 이 있 습 니 다.그림 6 을 보 세 요.

(그림 6:검은색 실선 을 대상 으로 하고 점선 은 값 이 며 주황색 실선 은 배열 이다)
RssReader 에서 cJSON 사용 하기:
RssReader 에서 JSON 을 분석 하기 위해 오픈 소스 라 이브 러 리 cJSON 을 사 용 했 기 때문에 cJSON 의 사용 을 소개 합 니 다.
CJSON 에서 키-value 키 값 은 cJSON 구조 체 변수 에 분석 되 고 저 장 됩 니 다.그 value 값 집합 은 FALSE,TRUE,NULL,NUMBER,STRING,OBJECT,ARRAY 입 니 다.이들 은 각각 CJSON 대상 의 child,valuestring,valueint,valuedouble 변수 에 저장 되 고 특정한 CJSON 대상 value 를 판단 하 는 데이터 형식 은 CJSON 대상 의 type 변수 이 며 그 수치 범 위 는 CJSON 대상 의 value 집합 과 일일이 대응 합 니 다.예 를 들 어 cJSONFalse 대응 FALSE.
cJSON Types:

#define   cJSON_False   0

#define   cJSON_True   1

#define   cJSON_NULL 2

#define   cJSON_Number  3

#define   cJSON_String  4

#define   cJSON_Array   5

#define   cJSON_Object  6
cJSON 구조 체:

typedef struct cJSON

{

  struct cJSON *next,*prev;  //     /   

  struct cJSON *child;  //     ,    type cJSON_Object cJSON_Array ,      。

  int type;          

  char *valuestring; //  type cJSON_String 

  int valueint;    //   type cJSON_Number 

  double valuedouble; // type cJSON_Number 

 

  char *string;    //       ,   key-value    key

} cJSON;
JSON 을 분석 하 는 과정 에서 JSON 형식 에서 설명 한 value 데이터 에서 CJSON 대상 에 저 장 된 변수의 맵 관 계 는 그림 7 과 같 습 니 다.
(그림 7)

CJSON 형식 에 대한 해석 은 cJSON 을 사용 합 니 다.Parse()방법,들 어 오 는 매개 변 수 는 CJSON 의 Object/Array 구조의 문자열 입 니 다.분석 에 성공 하면 cJSON 구조 체 변수의 지침 을 되 돌려 줍 니 다.사용 이 완료 되면 cJSON 을 호출 해 야 합 니 다.Delete()는 이 지침 을 소각 합 니 다.CJSON 은 트 리 구조 로 내부 의 각 cJSON 구조 체 변 수 를 구성 합 니 다.일반적으로 cJSON 구조 체 변 수 를 사용 하려 면 cJSON 을 호출 해 야 합 니 다.GetObject Item()방법 과 부모 노드 의 cJSON 구조 체 변수 포인터 와 이 항목 의 이름 에 따라 지침 을 가 져 옵 니 다.예 를 들 어:

bool bResult;

char jsonString[] = “{result:true}”;

//  result  true

cJSON* pItem = NULL;

cJSON* pRoot = cJSON_Parse ( jsonString );

if ( pRoot )

{

  pItem = cJSON_GetObjectItem ( pRoot, “result” );

  if ( pItem )

  {

    bResult = pItem->valueint;  //  result  type cJSON_False cJSON_True,        valueint   

  }

  cJSON_Delete ( pRoot );

}
상례 에서 result 의 값 type 이 어떤 유형 이 든 cJSON 호출 을 통 해GetObject Item()방법 은 cJSON 구조 체 변수의 지침 을 가 져 옵 니 다.해당 하 는 값 을 처리 할 때 만 다 릅 니 다.result 의 값 type 이 cJSON 이면Object,cJSON 호출 을 통 해GetObject Item(pItem,"subItemKey")은 하위 Item 의 지침 을 가 져 옵 니 다.처리 값 type 에서 cJSONArray 의 Item 은 다른 두 개의 API:cJSON 에 더 사용 해 야 합 니 다.GetArray Size()와 cJSONGetArrayItem()。우 리 는 배열 의 구성원 값 을 가 져 오 는 예 를 들 었 다.

char* out;

char jsonString[] = “{colors:[\“red\”, \“green\”,\ “blue\”, \“yellow\”, \“white\”]}”;

cJSON* pArray = NULL;

cJSON* pRoot = cJSON_Parse ( jsonString );

if ( pRoot )

{

  pArray = cJSON_GetObjectItem ( pRoot, “colors” );

  if ( pArray )

  {

    cJSON* pArrayItem = NULL;

    int nCount = cJSON_GetArraySize ( pArray ); //  pArray     

    for( int i = 0; i < nCount; i++)

    {

      pArrayItem = cJSON_GetArrayItem(pArray, i);

      out = cJSON_Print( pArrayItem );  // pArrayItem           char buffer ,cJSON_Print()         ,        。

      SS_printf( “array item %d: %s
”, i, out); Free( out ); } } cJSON_Delete ( pRoot ); }
복잡 한 JSON 형식의 데 이 터 를 추출 할 때 도 상기 두 가지 예 를 사용 한 방법 을 조합 하여 호출 할 뿐이다.그래서 CJSON 이 제공 하 는 API 의 사용 은 간단 하고 효과 적 입 니 다.이상 의 지식 을 알 게 되면 우 리 는 예 1 의 JSON 을 분석 하고 그 중의 데 이 터 를 추출 하 는 코드 를 작성 할 수 있 습 니 다.아니면 코드 를 붙 이 는 것 이 딱딱 한 도리 입 니까?코드 는 다음 과 같 습 니 다.
TChannelsData.h:

/**         

* 

*/

struct SUBCHNL_DATA

{

  SUBCHNL_DATA();

  void clear();

 

  TUChar * m_title;

  char * m_link;

  TUChar * m_desc;

};

 

/**         

* 

*/

struct CHANNEL_DATA

{

  CHANNEL_DATA();

 

  TUChar* m_pszTitle;

  vector m_aSubChnlList;

};

 

//………….

// TChannelsData      :RSSReaderConfig    

char m_pszVersion[32];

// TChannelsData      :      

vector m_aChnlsList;

//………….

TChannelsData.cpp: 

 
/**   JSON     

* 

* \param pszJsonText    JSON      

* 

* \return true:     ; false:      

*/

Boolean TChannelsData::ParseJson(char* pszJsonText)

{

  //char* out;

  cJSON* objJson;

 

  objJson= cJSON_Parse(pszJsonText);

 

  if (objJson)

  {

    //out=cJSON_Print(objJson);

    cJSON* objRootItem = NULL;

 

    //        

    objRootItem = cJSON_GetObjectItem(objJson, "result");

    if (objRootItem)

    {

      if (!objRootItem->valueint)

      {

        return FALSE;

      }

    }

    else

    {

      return FALSE;

    }

 

    //      ,   root

    objRootItem = cJSON_GetObjectItem(objJson, "root");

    if (objRootItem)

    {

      cJSON* objJsonItem = NULL;

 

      //     

      objJsonItem = cJSON_GetObjectItem(objRootItem, "version");

      if (objJsonItem)

      {

        Int32 nLen = strlen(objJsonItem->valuestring);

        strncpy(m_pszVersion, objJsonItem->valuestring, (nLen < 32)? nLen : 31);

      }

 

      //      

      _ParseChannels(objRootItem);

    }

    

    //SS_printf("=======[parse json]%s
",out); cJSON_Delete(objJson); //free(out); } return TRUE; } /** * * \param pCJson cJSON * * \return void */ void TChannelsData::_ParseChannels(cJSON* pCJson) { cJSON* pJsonArray = NULL; if (!pCJson) { return; } pJsonArray = cJSON_GetObjectItem(pCJson, "channels"); if(pJsonArray) { cJSON* pArrayItem = NULL; cJSON* pJsonTemp = NULL; Int32 nSize = cJSON_GetArraySize(pJsonArray); for (Int32 i = 0; i < nSize; i++) { pArrayItem = cJSON_GetArrayItem(pJsonArray, i); if (pArrayItem) { CHANNEL_DATA tChannelData; Int32 nLen = 0; // tChannelData.m_pszTitle = _JsonGetTUString(pArrayItem, "name"); // _ParseSubChnls(tChannelData.m_aSubChnlList, pArrayItem); // m_aChnlsList.push_back(tChannelData); } else { continue; } } } } /** * * \param aSubChnlList vector * \param pCJson cJSON * * \return void */ void TChannelsData::_ParseSubChnls(vector& aSubChnlList, cJSON* pCJson) { cJSON* pJsonArray = NULL; if (!pCJson) { return; } pJsonArray = cJSON_GetObjectItem(pCJson, "subchnls"); if (pJsonArray) { cJSON* pArrayItem = NULL; //cJSON* pJsonTemp = NULL; Int32 nSize = cJSON_GetArraySize(pJsonArray); for (Int32 i = 0; i < nSize; i++) { pArrayItem = cJSON_GetArrayItem(pJsonArray, i); if (pArrayItem) { SUBCHNL_DATA tSubChnlData; Int32 nLen = 0; //get title tSubChnlData.m_title = _JsonGetTUString(pArrayItem, "title"); //get link tSubChnlData.m_link = _JsonGetString(pArrayItem, "link"); //get desc tSubChnlData.m_desc = _JsonGetTUString(pArrayItem, "desc"); aSubChnlList.push_back(tSubChnlData); } } } } /** cJSON * * \param pJsonItem cJSON * \param pszKey cJSON * * \return JSON , TUChar */ TUChar* TChannelsData::_JsonGetTUString(cJSON* pJsonItem, char* pszKey) { TUChar* pszValue = NULL; Int32 nLen; cJSON* pJsonTemp = NULL; pJsonTemp = cJSON_GetObjectItem(pJsonItem, pszKey); if (pJsonTemp) { nLen = strlen(pJsonTemp->valuestring) + 1; pszValue = new TUChar[nLen]; if(pszValue) { MemSet(pszValue, 0, nLen * sizeof(TUChar)); TUString::StrUtf8ToStrUnicode(pszValue, (const Char*)pJsonTemp->valuestring); } } return pszValue; } /** cJSON * * \param pJsonItem cJSON * \param pszKey cJSON * * \return JSON , char */ char* TChannelsData::_JsonGetString(cJSON* pJsonItem, char* pszKey) { char* pszValue = NULL; Int32 nLen; cJSON* pJsonTemp = NULL; pJsonTemp = cJSON_GetObjectItem(pJsonItem, pszKey); if (pJsonTemp) { nLen = strlen(pJsonTemp->valuestring) + 1; pszValue = new char[nLen]; if(pszValue) { MemSet(pszValue, 0, nLen); strncpy(pszValue, pJsonTemp->valuestring, nLen - 1); } } return pszValue; } /** cJSON * * \param pJsonItem cJSON * \param pszKey cJSON * * \return JSON , int32 */ Int32 TChannelsData::_JsonGetInt(cJSON* pJsonItem, char* pszKey) { Int32 nValue = 0; cJSON* pJsonTemp = NULL; pJsonTemp = cJSON_GetObjectItem(pJsonItem, pszKey); if (pJsonTemp) { nValue = pJsonTemp->valueint; } return nValue; } /** cJSON * * \param pJsonItem cJSON * \param pszKey cJSON * * \return JSON , Boolean */ Boolean TChannelsData::_JsonGetBoolean(cJSON* pJsonItem, char* pszKey) { Boolean bValue = FALSE; cJSON* pJsonTemp = NULL; pJsonTemp = cJSON_GetObjectItem(pJsonItem, pszKey); if (pJsonTemp) { if(pJsonTemp->valueint) { bValue = TRUE; } } return bValue; }
요약:
JSON 의 구조 가 심 플 하기 때문에 JSON 의 문서 의 데 이 터 량 이 비교적 적 고 네트워크 데이터 의 교환 에 적합 하 며 JSON 문서 에 대한 분석 과 데이터 추출 방법 도 간단 하고 프로그래머 의 사용 에 편리 합 니 다.물론 JSON 의 구조 가 심 플 하기 때문에 JSON 의 가 독성 과 편집 성 이 XML 보다 약간 떨 어 집 니 다.따라서 JSON 은 인공 읽 기와 편집 이 적은 상태 에서 사용 하기에 적합 하 다.
비고:경험 증 이름 은"예 를 들 어 char jsonString[]="{\"result\\":true}"를 추가 해 야 합 니 다.
이상 은 여러분 에 게 가 져 온 json 형식 해석 과 libjson 의 용법 소개(cjson 의 사용 방법 에 관 한)의 모든 내용 입 니 다.많이 응원 해 주세요~

좋은 웹페이지 즐겨찾기