Analizando JSON con C [cerrado]


82

Estoy tratando de encontrar una buena manera de analizar JSON en C. Realmente no necesito una biblioteca enorme ni nada, prefiero tener algo pequeño y liviano con un mínimo de características, pero buena documentación.

¿Alguien tiene algo que pueda señalarme?


5
¿Estás usando una distribución de Linux?
Nick


¿Funcionaría la biblioteca de objetivo-c? Utilizo TouchJson en mi mac cuando en obj-c es muy fácil de usar y pequeño.
Nick

Cuando dices "mínimo básico", ¿cuán mínimo puedes llegar realmente? Algunos manejar varias codificaciones Unicode, algunos sólo UTF-8, y algunos sólo prestar atención al "ASCII los caracteres de formato", tales como {, [, ], }, ,, ", y la barra invertida. Pueden dejar o no dejar que las secuencias de escape Unicode dependan de usted, pueden dejar que usted verifique si los números están dentro del rango Unicode permitido, etc. Luego, existe la principal diferencia entre analizar JSON arbitrario en árboles y JSON conocido en C estructuras.
hippietrail

Respuestas:


74

Json no es un lenguaje enorme para empezar, por lo que es probable que las bibliotecas sean pequeñas (al menos, más que las bibliotecas Xml).

Hay un montón de bibliotecas de C enlazadas en Json.org . Quizás uno de ellos te funcione bien.


3
¡Sí, gracias por la respuesta! Revisé varios de ellos y estaban bastante mal documentados / mantenidos. Pensé que probaría aquí antes de sufrir por la integración de uno .... :)
dshipper

2
@dshipper: sourceforge.net/projects/cjson parece algo prometedor, dados sus requisitos. No he usado ninguna de estas bibliotecas, personalmente, así que no puedo recomendar una. Las sugerencias para una sola biblioteca solo son una opinión, de todos modos, y no una respuesta definitiva :)
Merlyn Morgan-Graham

5
@dshipper: He tenido buenas experiencias con jansson, que es ligero y está bien documentado. digip.org/jansson/doc/2.1
Dietrich Epp

1
@Dietrich, dshipper: Acabo de mirar a Jansson. Estoy de acuerdo en que está bien documentado y es bastante pequeño, y parece que tiene un buen conjunto de pruebas. Probablemente también se ajuste a sus requisitos. Pero probablemente haya varias bibliotecas que funcionarían. Te recomiendo que abstraigas tus dependencias de Json lo mejor que puedas, pruebes algunas bibliotecas y veas cuál te da el menor dolor :)
Merlyn Morgan-Graham

Entonces, @dshipper, ¿buscaste sourceforge.net/projects/cjson o qué?
Mawg dice reinstalar a Monica

37

cJSON tiene una API decente y es pequeño (2 archivos, ~ 700 líneas). Muchos de los otros analizadores JSON que miré al principio eran enormes ... Solo quiero analizar algo de JSON.

Editar: Hemos realizado algunas mejoras en cJSON a lo largo de los años.


10

Jsmn es bastante minimalista y solo tiene dos funciones con las que trabajar.

http://zserge.bitbucket.org/jsmn.html


Un inconveniente de jsmn es que no maneja secuencias de escape Unicode. En su fuente verás: /* Allows escaped symbol \uXXXX */... case 'u':.../* TODO */
hippietrail

14
Además, todo lo que hace es darte tokens, buena suerte para entender los datos. Parece la cosa más pequeña y eficiente que puede hacer, pero tampoco hace mucho.
NateS

Aparentemente, han arreglado su "TODO" para los símbolos Unicode.
aviggiano

9

NXJSON es un analizador JSON con todas las funciones pero muy pequeño (~ 400 líneas de código), que tiene una API fácil de usar:

const nx_json* json=nx_json_parse_utf8(code);
printf("hello=%s\n", nx_json_get(json, "hello")->text_value);
const nx_json* arr=nx_json_get(json, "my-array");
int i;
for (i=0; i<arr->length; i++) {
  const nx_json* item=nx_json_item(arr, i);
  printf("arr[%d]=(%d) %ld\n", i, (int)item->type, item->int_value);
}
nx_json_free(json);

Como parece ser el desarrollador de NXJSON, tal vez podría comentar cómo se compara con cJSON u otras opciones.
Matt

5
Cosas simples hechas de manera simple: esta es la principal diferencia entre NXJSON y la mayoría de los demás analizadores. cJSON también es simple, pero más allá del analizador json, también incluye el constructor json y el serializador. cJSON necesita más memoria ya que duplica todas las cadenas, mientras que NXJSON hace todas las manipulaciones en su lugar destruyendo el contenido original. Dependiendo de su tarea, estas diferencias pueden considerarse ventajas o desventajas. NXJSON también maneja comentarios, lo cual es bueno para analizar archivos de configuración.
Yaroslav Stavnichiy

9

Puedes echar un vistazo a Jansson

El sitio web establece lo siguiente: Jansson es una biblioteca C para codificar, decodificar y manipular datos JSON. Cuenta con:

  • Modelo de datos y API simple e intuitivo
  • Puede codificar y decodificar desde JSON
  • Documentación completa
  • Sin dependencias de otras bibliotecas
  • Soporte completo de Unicode (UTF-8)
  • Amplia suite de pruebas

1
Enlace directo de Github: github.com/akheron/jansson
Ray Hulha

Tuve la tentación de usarlo jsmndebido a su velocidad [1], pero no admite la codificación. Además, Jansson es realmente fácil de usar. --- [1] translate.google.it/…
Marco Sulla

OjC es rápido y admite codificación. github.com/ohler55/ojc
Peter Ohler

Jansson es mi opción para analizar JSON en C
Kenneth Wilke

8

Solía JSON-C para un proyecto de trabajo y lo recomendaría. Ligero y se lanza con licencia abierta.

La documentación está incluida en la distribución. Básicamente, tiene *_addfunciones para crear objetos JSON, *_putfunciones equivalentes para liberar su memoria y funciones de utilidad que convierten tipos y objetos de salida en representación de cadena.

La licencia permite la inclusión con su proyecto. Lo usamos de esta manera, compilando JSON-C como una biblioteca estática que está vinculada con la compilación principal. De esa manera, no tenemos que preocuparnos por las dependencias (aparte de instalar Xcode).

JSON-C también se creó para nosotros bajo OS X (x86 Intel) y Linux (x86 Intel) sin incidentes. Si su proyecto necesita ser portátil, este es un buen comienzo.


6

¿Necesita analizar estructuras JSON arbitrarias o solo datos específicos de su aplicación? Si es lo último, puede hacerlo mucho más liviano y eficiente al no tener que generar ninguna estructura de mapa / tabla hash que asigne claves JSON a valores; en su lugar, puede almacenar los datos directamente en campos de estructura o lo que sea.


2
Este es un punto muy importante cuando se usa JSON con lenguajes no dinámicos como C. Pero no es una respuesta, así que realmente debería ser un comentario a la pregunta del OP.
hippietrail

+1 por pensamiento creativo! Sin embargo, ¿cómo funcionaría eso? ¿No podría esto todavía hacer uso de una biblioteca particularmente liviana? Analizar en campos de estructura todavía suena como un poco de trabajo.
CL22
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.