#include "json_str.h"
#include <stdlib.h>
#include <string.h>
int int_json_str_length;
/*******************************
JSON generator by vonchenchen
*******************************/
//********针对不同系统更换malloc函数******
#define MY_DATA_MALLOC_SIZE 128
#define MY_TYPE_MALLOC_SIZE 256
char DataMem[MY_DATA_MALLOC_SIZE];
char TypeMem[128];
char *mPtr = TypeMem;
char *mPtrRecord = TypeMem;
void *myMemMalloc(int size){
//return mymalloc(size);
char *ptr = mPtr;
mPtr = mPtr + size;
return ptr;
}
void myMemFree(void *ptr){
//myfree(ptr);
mPtr = mPtrRecord;
memset(mPtrRecord, 0, MY_DATA_MALLOC_SIZE);
memset(DataMem, 0, MY_TYPE_MALLOC_SIZE);
}
void myMemCpy(void *des,void *src,int n){
//mem_memcpy(des, src, n);
memcpy(des, src, n);
}
//***********获取json键值对节点******************
JSONNode *newJSONNode(){
JSONNode *node = myMemMalloc(sizeof(JSONNode));
return node;
}
//***********获取jsonObject节点******************
JSONObjectNode *newJSONObjectNode(){
JSONObjectNode *node = myMemMalloc(24);
return node;
}
//***********************************************
MyString *initMyString(MyString *myString,
char *str,
int (* size)(char *str),
int (* charAt)(char *str, int index),
char *(* subString)(char *str, int index, int length),
char *(* append)(char *str, char *des)){
myString->str = str;
myString->size = size;
myString->charAt = charAt;
myString->subString = subString;
myString->append = append;
return myString;
}
int fun_json_str_size(char *str){
int i = 0;
while(str[i] != '\0'){
i++;
}
int_json_str_length = i;
return int_json_str_length;
}
char fun_json_str_charAt(char *str, int index){
if(index >= int_json_str_length){
return NULL;
}
return str[index];
}
char *fun_json_str_subString(char *str, int index, int length){
char *ptr = NULL;
return ptr;
}
char *fun_json_str_append(char *src, char *des){
char *ptr = NULL;
return ptr;
}
//***********************************************************
JSONList *initLinkList(){
//int length = sizeof(JSONList); //长度测量不正确 此处直接写死
JSONList *ret = myMemMalloc(24);
ret->start = NULL;
ret->end = NULL;
ret->length = 0;
return ret;
}
void initJSONNode(JSONNode *node, char *key, char *value, int type){
node->key = key;
node->value = value;
node->keyLength = strlen(key);
node->valueLength = strlen(value);
node->type = type;
}
/**
* 添加一个键值对普通键值对
*/
void addNode(JSONList *list, char *key, char *value){
JSONNode *node = NULL;
node = newJSONNode();
if(list->length == 0){
node->next = NULL;
node->prev = NULL;
list->start = node;
list->end = node;
}else{
node->next = NULL;
node->prev = list->end;
list->end->next = node;
list->end = node;
}
list->length++;
node->type = JSONTYPE_KV;
node->keyLength = strlen(key);
node->valueLength = strlen(value);
node->key = key;
node->value = value;
}
/**
* 添加一个值为数组的键值对
*/
void addJSONArray(JSONList *list, char *key, JSONObjectNode **value, int length){
JSONNode *node = NULL;
int i;
JSONNode *indexNode = list->start;
int sameKeyFlag = 0;
while(indexNode != NULL){ //遍历链表,查找是否已经存在相同的key
int cmp = strcmp(indexNode->key, key);
if(cmp == 0){
sameKeyFlag = 1;
node = indexNode; //如果存在,直接获取节点
break;
}
indexNode = indexNode->next;
}
if(sameKeyFlag == 0){ //如果不存在,创建一个node并加入链表
node = newJSONNode();
node->arrayLength = -1;
if(list->length == 0){
node->next = NULL;
node->prev = NULL;
list->start = node;
list->end = node;
}else{
node->next = NULL;
node->prev = list->end;
list->end->next = node;
list->end = node;
}
list->length++;
}
node->type = JSONTYPE_ARR;
node->keyLength = strlen(key);
//node->valueLength = strlen(value);
node->key = key;
//node->array[node->arrayIndex] = value;
//node->arrayIndex++;
node->value = NULL;
node->valueLength = 0;
node->objectNode = value;
node->arrayLength = length;
}
/**
* 生成一个json普通json键值对字符串
*/
char *getJSONObjString(char *mem, int *index, JSONNode *nodePtr){
char *str = NULL;
mem[(*index)++] = '"';
memcpy(mem+(*index), nodePtr->key, nodePtr->keyLength);
*index = *index + nodePtr->keyLength;
mem[(*index)++] = '"';
mem[(*index)++] = ':';
memcpy(mem+(*index), nodePtr->value, nodePtr->valueLength);
*index = *index + nodePtr->valueLength;
mem[(*index)] = '\0';
str = mem;
return str;
}
/**
* 生成一个json数组字符串
*/
char *getJSONArrayString(char *mem, int *index, JSONNode *nodePtr){
char *str = NULL;
int i,j;
int length = nodePtr->arrayLength;
int type;
mem[(*index)++] = '"';
memcpy(mem+(*index), nodePtr->key, nodePtr->keyLength);
*index = *index + nodePtr->keyLength;
mem[(*index)++] = '"';
mem[(*index)++] = ':';
if(length > 0){
mem[(*index)++] = '[';
for(i=0; i<length; i++){//json数组的每个子json串
JSONObjectNode *objectNode;
if(i == 0){
objectNode = nodePtr->objectNode[i];
}else{
objectNode = objectNode->next;
}
mem[(*index)++] = '{';
for(j=0; j<objectNode->length; j++){
type = objectNode->jsonNode[j]->type;
if(type == JSONTYPE_KV){
getJSONObjString((mem), index, objectNode->jsonNode[j]);
}else if(type == JSONTYPE_ARR){
getJSONArrayString((mem), index, objectNode->jsonNode[j]);
}
mem[(*index)++] = ',';
}
mem[(*index)-1] = '}';
if(i < nodePtr->arrayLength-1){
mem[(*index)++] = ',';
}
}
mem[(*index)++] = ']';
}
mem[(*index)] = '\0';
str = mem;
return str;
}
/**
* 将jsonList转换为json字符串
*/
char *getJsonString(JSONNode **start, int length){
int i,j;
int arrayLength;
JSONNode *nodePtr = *start;
char *jsonStr = myMemMalloc(256);
int index = 0;
jsonStr[0] = '{';
index++;
for(i=0; i<length; i++){
if(nodePtr != NULL){
if(nodePtr->type == JSONTYPE_KV){
getJSONObjString(jsonStr, &index, nodePtr);
}else if(nodePtr->type == JSONTYPE_ARR){
getJSONArrayString(jsonStr, &index, nodePtr);
}
jsonStr[index] = ',';
index++;
}
nodePtr = nodePtr->next;
}
jsonStr[index-1] = '}';
jsonStr[index] = '\0';
return jsonStr;
}
char key1[] = "name";
char value1[] = "chen";
char* testJSON(){
JSONList *list = initLinkList();
JSONObjectNode *obj1 = newJSONObjectNode();
JSONObjectNode *obj2 = newJSONObjectNode();
obj1->jsonNode = myMemMalloc(24);
obj2->jsonNode = myMemMalloc(24);
addNode(list, "name", "chen");
addNode(list, "abcd", "chenchen");
addNode(list, "gender", "female");
addNode(list, "age", "27");
JSONNode *node1 = newJSONNode();
initJSONNode(node1, "key1", "value1", JSONTYPE_KV);
JSONNode *node2 = newJSONNode();
initJSONNode(node2, "key2", "value2", JSONTYPE_KV);
obj1->jsonNode[0] = node1;
obj1->jsonNode[1] = node2;
obj1->length = 2;
JSONNode *node3 = newJSONNode();
initJSONNode(node3, "key3", "value3", JSONTYPE_KV);
JSONNode *node4 = newJSONNode();
initJSONNode(node4, "key4", "value4", JSONTYPE_KV);
obj2->jsonNode[0] = node3;
obj2->jsonNode[1] = node4;
obj2->length = 2;
obj1->next = obj2;
addJSONArray(list, "array", &obj1, 2);
//addJSONArray(list, "array", node1);
//addJSONArray(list, "array", node2);
c