Archive

Archive for September, 2008

JSON++ compiled with VS 6.0

September 17th, 2008

Χρειαζόμουν έναν τρόπο να συνδέσω ένα c++ script με ένα php script, ώστε να ανταλλάσουνε δεδομένα. Στην αρχή σκέφτηκα με xml από το stdin/stdout, άλλα δεν ήθελα και τόσο δομημένη πληροφορία, όποτε αποφάσισα να χρησιμοποιήσω json.

Για php δεν υπήρχε συζήτηση ότι θα χρησιμοποιούσα μία κλάση που έχω βρει, και την έχω δουλέψει αρκετά σε πολλά projects, την Services_JSON. Για C++ όμως δεν είχα χρησιμοποιήσει ποτέ, όποτε έπρεπε να ψάξω και να βρω κάτι που να με βολεύει.
Googlesearch, json.org, πολλά project, στα πρώτα αποτελέσματα, άλλα όχι κάτι απλό έτσι που το ήθελα εγώ. Κάπου στη 3η σελίδα βρήκα ένα ενδιαφέρον project το JSON++. Αμέσως το κατέβασα, και έφτιαξα ένα test project στο Visual Studio 6.0 να το δοκιμάσω. Το JSON++ όμως ήταν για Visual Studio .NET. Δεν πτοήθηκα, διότι στο παρελθών έχω κάνει και compile το php5 με VC++ 6.0, οπότε ξεκίνησα τις αλλαγές ώστε να γίνει το compile.
Στο αρχείο value.cpp στην γραμμή 428 και 432, διόρθωσα την εντολή swprintf από
swprintf(strnum,31,L”%.1lld”,(*(__int64 *)val));
σε
swprintf(strnum,L”%.1lld”,(*(__int64 *)val));

και
swprintf(strnum,31,L”%lG”,(*(double *)val));

σε
swprintf(strnum,L”%lG”,(*(double *)val));

Στο αρχείο parser.h έβγαλα την μεταβλητή errstrings, από την γραμμή 28 extern const wchar_t *errstrings[8];
Στο αρχείο parser.cpp πρόσθεσα τα παρακάτω includes στην αρχή

#include <stdio.h>

#include <stdlib.h>

Μετέφερα την μεταβλητή errstrings από το αρχείο errstrings.cpp εδώ μέσα namespace json {const wchar_t *errstrings[9]={
/*0*/ L”Invalid Unicode escape sequence”,
L”Tried to read past End of File”,
L”Error reading Array, ] expected”,
L”Unquoted object names not allowed”,
L”Error reading Object, : expected after name”,
/*5*/ L”Error reading Object, } expected”,
L”Could not find a valid Object value”,
L”Invalid unquoted string, or misspelled literal”,
L”Duplicate value name in Object”
};

και στην γραμμή 253 του παλιού αρχείο άλλαξα την συνάρτηση _wtof σε _wtol.Από
val->setnumber(_wtof(number.c_str()));
σε
val->setnumber(_wtol(number.c_str()));

Αυτό βέβαια δεν είναι σωστό, γιατί μία μεταβλητή float θα χαλάει, το σωστό θα ήταν να ασχολούμουν λίγο παραπάνω και να έβρισκα το σωστό συνδυασμό από functions προκείμενο να μετατραπεί σωστά το string σε float. Στην προκειμένη περίπτωση δεν θα είχα float όποτε και δεν ασχολήθηκα παραπάνω. Αν κάποιος το βρει θα ήθελα να το γράψει στα σχόλια για είναι ποιο ολοκληρωμένη η μετατροπή του project από .net σε 6.0.Τέλος έβγαλα το αρχείο errstrings.cpp από το compile γιατί ήταν άχρηστο πλέων, και το compile έγινε κανονικά.

Το JSON++ ήταν ακριβώς αυτό που χρειαζόμουν, διότι είναι πού εύκολο στην χρήση του σε αντίθεση με τα υπόλοιπα open source projects.

JSON, c++, php , ,