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 의 사용 방법 에 관 한)의 모든 내용 입 니 다.많이 응원 해 주세요~
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
콘텐츠 SaaS | JSON 스키마 양식 빌더Bloomreach Content를 위한 JSON Form Builder 맞춤형 통합을 개발합니다. 최근 Bloomreach Content SaaS는 내장 앱 프레임워크를 사용하여 혁신적인 콘텐츠 유형 필드를 구축할...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.