मैं JSON से कुछ पाठ प्राप्त करने के लिए jsmn JSON parser (source code) का उपयोग कर रहा हूं। जेएसएमएन टोकन में डेटा स्टोर करता है, लेकिन टोकन कोई डेटा नहीं रखता है, तो वे इसके बजाय JSON स्ट्रिंग में टोकन सीमाओं को इंगित करते हैं।यह विधि सेगमेंटेशन गलती क्यों फेंकती है?
- वस्तु [0..31]
- स्ट्रिंग [3..7], स्ट्रिंग [12..16], स्ट्रिंग [20..23] : उदाहरण के लिए, jsmn तरह टोकन पैदा करेगा
- संख्या [27..29]
इस विधि (स्ट्रिंग वस्तुओं के लिए) उन मूल्यों के बीच वास्तविक पात्रों को पुनः प्राप्त करने के लिए इस्तेमाल किया जाता है:
char* getTextFromJSON(const char *json)
{
if (!json) return NULL;
json_parser p;
#define N_TOKENS 15 // this normally would be at the start of the file
jsontok_t tokens[N_TOKENS];
initJsonParser(&p);
int err parseJson(&p, json, tokens, N_TOKENS);
if (err) {
fprintf(stdout, "Error parsing JSON: %d\n", err);
return NULL;
}
for (int i = 0; i < N_TOKENS; ++i) {
jsontok_t *key = &tokens[i];
if (!memcmp("utterance", &json[key->start], (size_t) (key->end - key->start))) {
++key;
return strndup(&json[key->start], (size_t)(key->end - key->start));
}
}
return NULL;
}
यहाँ कुछ JSON उदाहरण हैं कि wo पार्सर में डाल दिया uld:
{"status":0,"id":"432eac38858968c108899cc6c3a4bade-1","hypotheses":[{"utterance":"test","confidence":0.84134156}]}
{"status":5,"id":"695118aaa3d01dc2ac4aa8054d1e5bb0-1","hypotheses":[]}
विधि करने के लिए पहले उदाहरण JSON गुजर पर, मैंने "परीक्षण" की उम्मीद मूल्य प्राप्त विधि से लौट आए। हालांकि, विधि में खाली JSON को पारित करने पर, मुझे सशर्त if
कथन पर for
लूप के 8 वें पुनरावृत्ति पर सेगमेंटेशन गलती मिलती है।
कोई सुझाव? -> and-> अंत शुरू
key->start: 0x00000000
key->end - key->start: 0x00000046
key->start: 0x00000002
key->end - key->start: 0x00000006
key->start: 0x0000000A
key->end - key->start: 0x00000001
key->start: 0x0000000D
key->end - key->start: 0x00000002
key->start: 0x00000012
key->end - key->start: 0x00000022
key->start: 0x00000037
key->end - key->start: 0x0000000A
key->start: 0x00000043
key->end - key->start: 0x00000002
key->start: 0x3A7B3188
key->end - key->start: 0x7A0F0766
तुम सच में पारित करने के लिए करना चाहते हैं 'और जेसन' memcpy' करने के लिए [..] '? –
@UchiaItachi उस विधि में कोई 'memcpy' नहीं है ... – syb0rg
'(key-> start)' के मानों को मुद्रित करने के लिए अपने लूप में 'printf()' कथन दें, और '(key-> end - key -> शुरू करें) 'हेक्स में (यानी:' printf ("0x% 08X", वैल) '। मैं आपकी इनपुट स्ट्रिंग,' जेसन' की ओर झुका रहा हूं, उम्मीद से कम है, और आप एक अवैध सूचक पास कर रहे हैं। – DevNull