2016-05-23 16 views
0

Ich versuche, JSON-String zu lesen und zu drucken, produziert es Segmentierungsfehler (Core Dumped). Ich denke, dass der Fehler wegen der Eingabezeichenkette aber nicht wirklich sicher ist.Segmentierung Fehler beim Lesen von JSON-String

Hier ist der Code

Code:

#include <json/json.h> 
#include <stdio.h> 

void json_parse(json_object * jobj); 

int main(){ 

char * string = "{" 
       "\"coooooool\": { " 
            "\"name\" : \"coooooooooool\"," 
            "\"name\" : 1" 
            "\"}" 
       "\"}"; 

printf ("JSON string: %sn", string); 
json_object * jobj = json_tokener_parse(string); 
json_parse(jobj); 


return 0; 
} 

void json_parse(json_object * jobj) { 
enum json_type type; 
json_object_object_foreach(jobj, key, val) { 
    type = json_object_get_type(val); 
    switch (type) 
    { 
     case json_type_int: printf("type: json_type_int, "); 
     printf("value: %dn", json_object_get_int(val)); 
     break; 
    } 
    } 
} 

ich die Ausgabe Binärdatei mit valgrind lief den Fehler richtig

Ich erhalte diesen Fehler zu überprüfen, während mit valgrind

läuft
==14573== Memcheck, a memory error detector 
==14573== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al. 
==14573== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info 
==14573== Command: ./a.out 
==14573== 
==14573== Invalid read of size 4 
==14573== at 0x40491F8: json_object_get_object (in /usr/lib/i386-linux-gnu/libjson.so.0.0.1) 
==14573== by 0x80485E5: main (in /var/www/json/a.out) 
==14573== Address 0xfffffff5 is not stack'd, malloc'd or (recently) free'd 
==14573== 
==14573== 
==14573== Process terminating with default action of signal 11 (SIGSEGV) 
==14573== Access not within mapped region at address 0xFFFFFFF5 
==14573== at 0x40491F8: json_object_get_object (in /usr/lib/i386-linux-gnu/libjson.so.0.0.1) 
==14573== by 0x80485E5: main (in /var/www/json/a.out) 
==14573== If you believe this happened as a result of a stack 
==14573== overflow in your program's main thread (unlikely but 
==14573== possible), you can try to increase the size of the 
==14573== main thread stack using the --main-stacksize= flag. 
==14573== The main thread stack size used in this run was 8388608. 
JSON string: {"coooooool": { "name" : "coooooooooool","name" : 1"}"}n==14573== 
==14573== HEAP SUMMARY: 
==14573==  in use at exit: 0 bytes in 0 blocks 
==14573== total heap usage: 17 allocs, 17 frees, 1,511 bytes allocated 
==14573== 
==14573== All heap blocks were freed -- no leaks are possible 
==14573== 
==14573== For counts of detected and suppressed errors, rerun with: -v 
==14573== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0) 
Segmentation fault (core dumped) 
+1

warum die Anführungszeichen vor der schließenden Klammer? –

+0

Wo ist Speicher für 'json_object * jobj' reserviert? Tut die JSON-Lib das oder bist du verantwortlich? Es scheint so, als ob du es bist, aber ich habe die Bibliothek noch nicht benutzt, also überprüfe es. 'Adresse 0xfffffff5 ist nicht Stack'd, Malloc'd oder (kürzlich) frei '?? –

Antwort

0

Ihr Problem ist einfach: Sie haben Fehler in der JSON-String.
Ihr JSON-String ist die folgende (ohne die Anführungszeichen zu entkommen):

{"coooooool": { "name" : "coooooooooool","name" : 1"}"} 

Zwei Tasten die gleichen Namen haben, und die beiden letzten doppelten Anführungszeichen Zeichen des Strings sind völlig fehl am Platz.
Diese Zeichenfolge ist kein gültiger JSON und daher gibt json_tokener_parse NULL zurück.
Sie sollten Fehlerprüfung durchführen, den Fehler zu fangen die Zeichenfolge zu analysieren, das heißt eine Überprüfung wie folgt hinzu:

if(jobj == NULL) { 
    // recover from the error or quit the program 
} 

mit Ihrem Code, json_object_object_foreach erhält einen NULL-Zeiger, die Segmentierungsfehler verursacht.

+0

ja. segfault ist wegen ungültigem json. aber der Code ist nicht in der Lage, Werte in json_parse() zu drucken. Ich meine die json_type_int. Bitte überprüfen Sie meinen Code – sandesh

+0

das ist richtig. Das liegt daran, dass der Code alle Schlüssel im Wurzelobjekt durchläuft, und es gibt nur einen: "cooooool", der kein int, sondern ein json-Objekt ist. –

+0

danke es hat geholfen – sandesh

1

Ihr JSON ist ungültig. Versuchen Sie es mit einem richtig formatiert JSON-String und es funktioniert:

#include <stdio.h> 
#include <json/json.h> 

void json_parse(json_object * jobj); 

int main(){ 

    char * string2 = "{" 
      "\"coooooool\": { " 
      "\"name\" : \"coooooooooool\"," 
      "\"name\" : 1" 
      "\"}" 
      "\"}"; 
    char * string = "{\"name\" : \"joys of programming\"}"; 
    printf ("JSON string: %sn", string); 
    // json_object * jobj = malloc(sizeof(json_object)); 
    json_object * jobj = json_tokener_parse(string); 
    json_parse(jobj); 


    return 0; 
} 

void json_parse(json_object * jobj) { 
    enum json_type type; 
    json_object_object_foreach(jobj, key, val) { 
     type = json_object_get_type(val); 
     switch (type) 
     { 
      case json_type_int: printf("type: json_type_int, "); 
       printf("value: %dn", json_object_get_int(val)); 
       break; 
     } 
    } 
} 

Sie können lint your json zu überprüfen, wie Sie es wollen.

Ausgabe

./test1 
JSON string: {"name" : "joys of programming"} 

ich es wie folgt zusammengestellt

gcc -g -v -Wall -std=gnu99 -static -L/path/to/json-c-0.9/lib main.c -o test1 -ljson

+0

Nicht das ungültige JSON sollte einen segfault verursachen ... –

+0

yeah. segfault ist wegen ungültigem json. aber der Code ist nicht in der Lage, Werte in json_parse() zu drucken. Ich meine die json_type_int. Bitte überprüfe meinen Code. – sandesh