La biblioteca JSON base cero
Proyecto Dirección jsoncpp , este proyecto ha sido leptjson inspirado para lograr la función más básica, sólo para aprender a usar.
- Proporciona un análisis sintáctico sencilla () y generar () texto JSON método analiza en objetos, y viceversa
- Sólo es compatible con el valor de tipo primitivo de JSON y JSON texto conversión árbol de sintaxis abstracta
- Usando el lenguaje estándar de C / C ++ (C ++ 11)
- No nos basamos en las bibliotecas de terceros
comienzo
Iniciar este necesidades del proyecto para ser instalados gcc4.8 o posterior (con el apoyo de C ++ 11)
rm *.o
rm start
g++ -w -c -std=c++11 jsonValue.cpp
g++ -w -c -std=c++11 jsonGenerator.cpp
g++ -w -c -std=c++11 jsonParser.cpp
g++ -w -c -std=c++11 test.cpp
g++ -w jsonValue.o jsonGenerator.o jsonParser.o test.o -o start
./start
Inscripción preliminar
Entonces podemos empezar a pensar en un problemas más simples comienzan con la forma de resolver un texto JSON.
1, dado el largo texto "[1,2,3]", preguntando cómo conseguir una matriz?
Cuando queremos resolver una función continua que se llama para hacer frente a un texto largo, funciones analíticas requeridos realizan en dos pasos:
- texto de análisis paso 1 y actualizar el puntero de texto.
- Paso 2 resuelto con éxito si se devuelve el resultado del análisis.
Aquí funciones analíticas sólo tienen que llamar tres veces, la última de encuentro ']' a extremo
class Parser{
char *txt;
int parse_value() {
/* 解析txt上下文 */
/* 返回一个数值 */
}
}
int main() {
/* 建立parser */
while (*parser.txt != ']') {
array[i] = parser.parse_value();
}
}
2, dado el largo texto "[1, 2, [4,5]]", preguntando cómo conseguir un árbol?
Del mismo modo, existe la necesidad de llamar a las funciones analíticas en tres ocasiones, la última de encuentro ']' a fin
typedef struct {
int number;
vector<Node* > array;
} TreeNode
class Parser{
char* txt;
TreeNode* parse_value() {
/* 解析txt上下文 */
/* 返回一个节点 */
}
}
int main() {
/* 建立parser */
/* 建立树根 */
while (*parser.txt != ']') {
root.array[i] = parser.parse_value();
}
}
Después de la finalización del texto largo analítica, y luego considerar la propia función analítica de lograr. '1', '2' se pueden resolver directamente, mientras que "[4,5]" puede ser visto como un texto largo, para hacer llamadas recursivas.
El proceso anterior he adoptado el diseño orientado a objetos, cada operación es una función del objeto. Por supuesto, también podemos adoptar el pensamiento orientado al proceso, pero asegúrese de abordar puntero de texto txt de entrada para cada función, o el uso de referencia.
3, dado el JSON texto largo, preguntando cómo conseguir un árbol?
El proyecto jsoncpp es la respuesta a esta pregunta.