Un modo ideale per decodificare i documenti JSON in C?

3

Supponendo che io abbia un'API da consumare che usa JSON come metodo di trasmissione dati, qual è il modo ideale per decodificare il JSON restituito da ciascuna risorsa API? Ad esempio, in Java vorrei creare una classe per ogni risorsa API, quindi avviare un oggetto di quella classe e consumarne i dati.

ad esempio:

class UserJson extends JsonParser
{
    public function UserJson(String document) {
    /*Initial document parsing goes here...*/
    }
//A bunch of getter methods . . . .
}

Probabilmente fai qualcosa di simile a questo:

UserJson userJson = new UserJson(jsonString);//Initial parsing goes in the constructor
String username = userJson.getName();//Parse JSON name property then return it as a String.  

O quando si utilizza un linguaggio di programmazione con array associativi (ad es., tabella hash) il processo di decodifica non richiede la creazione di una classe:

(PHP)

$userJson = json_decode($jsonString);//Decode JSON as key=>value  
$username = $userJson['name'];

Ma, quando sto programmando in linguaggi di programmazione procedurale (C), non posso andare con nessuno dei due metodi, dato che C non è né OOP né supporta array associativi (di default, almeno).

Qual è il metodo "corretto" per analizzare stringhe JSON predefinite (ad esempio, documenti JSON specificati dal provider API tramite esempi o documentazione)?

Il metodo che sto usando attualmente sta creando un file per analizzare ogni risorsa API, il problema con questo metodo è che è fondamentalmente una versione scadente del metodo OOP, poiché sembra esattamente come il metodo OOP ma non lo fa fornire eventuali vantaggi OOP (ad esempio, non può passare un oggetto del parser, ecc.).

Ho pensato di incapsulare ogni file parser delle risorse API in una struttura accessibile pubblicamente (puntando tutte le funzioni / variabili pubblicamente utilizzabili alla struttura) quindi accedendo al codice del file parser dalla struttura ( parser.parse() , parser.getName() , ecc.). In questo modo sembra un po 'meglio del mio attuale metodo, ma è solo una fregatura del modo OOP, non è vero?

Qualche suggerimento sui metodi per analizzare i documenti JSON sui messaggi di programmazione procedurali? Qualche commento sui metodi che utilizzo attualmente (o 3 di essi)?

    
posta Abdulaziz 20.09.2013 - 23:59
fonte

3 risposte

4

Poiché C è tipizzato staticamente e JSON no, e qualsiasi elemento JSON può essere un null, un numero, una stringa, un booleano, un oggetto o un array, devi fondamentalmente farlo come "una fregatura del Modo OOP ". Crea un tipo di record che rappresenta un valore JSON e ha un membro che è un tag che indica il tipo di valore JSON che è, quindi crea "sottoclassi" che costruiscono su questo tipo di record. Per rappresentare bene JSON in C, devi fondamentalmente ricreare OOP e polimorfismo.

Qualsiasi cosa che usa un valore JSON dovrà prendere un puntatore al tipo di record di base. Ricorda che gli oggetti sono sempre tipi di riferimento, nonostante le scarse scelte di progettazione del linguaggio C ++, perché altrimenti si rovina il polimorfismo e hai bisogno del polimorfismo per farlo correttamente. Quando scopri il tipo di "sottoclasse" con cui stai effettivamente lavorando, (controllando il membro del tag,) puoi lanciare il tuo puntatore del valore JSON al puntatore del tipo di sottoclasse appropriato per accedere al resto del record.

    
risposta data 21.09.2013 - 00:27
fonte
1

Lo stai facendo bene. Questo è un vecchio problema: i vari tipi di JSON e gli aspetti di presentazione non ordinata sono essenzialmente gli stessi presentati da ogni linguaggio di markup dei dati che risale almeno a SGML.

Per C in particolare, ci sono molte opzioni già disponibili. Googling "C JSON Parser" presenta molti, tra cui jsmn , che sembra aver imparato molte delle lezioni che l'elaborazione Java di XML doveva insegnare. Più direttamente al punto, questo è stato indirizzato su StackOverflow again e nuovo . E, naturalmente, JSON.org di Crockford elenca 16 diverse implementazioni C di JSON.

    
risposta data 21.09.2013 - 14:59
fonte
0

Ho avuto lo stesso problema. Ho risolto le strutture in c e volevo importare / esportare da / verso oggetti / array json. La libreria risultante è qui: link e utilizza link per l'effettivo json parse / stringify.

Funziona consentendo di aggiungere annotazioni alle intestazioni di c struct, quindi analizzare le intestazioni e generare metadati che consentono di allineare il json con le strutture c per l'importazione / esportazione di una riga.

//@json
struct my_my_json_data {
    /*
    @schema {
        "title": "ID",
        "description": "unique object id",
        "type": "int"
    }
    */
    uint64_t id;

    /* don't include in json */
    //@private
    int _id;

    bool active;
}
    
risposta data 03.01.2016 - 02:18
fonte