mirror of https://github.com/kgabis/parson.git
parent
1058e3b2c0
commit
a040f92d9c
@ -0,0 +1,187 @@ |
||||
#include <stdio.h> |
||||
#include <stdlib.h> |
||||
#include <string.h> |
||||
|
||||
#include "parson.h" |
||||
#define DOUBLE_SERIALIZATION_FORMAT "%f" |
||||
|
||||
typedef struct serializationContext |
||||
{ |
||||
FILE *file; |
||||
int identation; |
||||
}SerContext; |
||||
|
||||
static void json_serialize_string_file(const char *string, SerContext *ctx) { |
||||
size_t i = 0, len = strlen(string); |
||||
char c = '\0'; |
||||
fprintf(ctx->file, "\""); |
||||
for (i = 0; i < len; i++) { |
||||
c = string[i]; |
||||
switch (c) { |
||||
case '\"': fprintf(ctx->file, "\\\""); break; |
||||
case '\\': fprintf(ctx->file, "\\\\"); break; |
||||
case '\b': fprintf(ctx->file, "\\b"); break; |
||||
case '\f': fprintf(ctx->file, "\\f"); break; |
||||
case '\n': fprintf(ctx->file, "\\n"); break; |
||||
case '\r': fprintf(ctx->file, "\\r"); break; |
||||
case '\t': fprintf(ctx->file, "\\t"); break; |
||||
default: fprintf(ctx->file, "%c", c); break; |
||||
} |
||||
} |
||||
fprintf(ctx->file, "\""); |
||||
} |
||||
|
||||
void WriteIdentation(SerContext *ctx) |
||||
{ |
||||
int i; |
||||
for (i = 0; i < ctx->identation; ++i) |
||||
{ |
||||
fprintf(ctx->file, " "); |
||||
} |
||||
} |
||||
|
||||
JSON_Status json_serialize_to_file_pretty_r(const JSON_Value *value, SerContext *ctx) |
||||
{ |
||||
const char *key = NULL, *string = NULL; |
||||
JSON_Value *temp_value = NULL; |
||||
JSON_Array *array = NULL; |
||||
JSON_Object *object = NULL; |
||||
size_t i = 0, count = 0; |
||||
double num = 0.0; |
||||
JSON_Status status = JSONError; |
||||
|
||||
switch (json_value_get_type(value)) { |
||||
case JSONArray: |
||||
array = json_value_get_array(value); |
||||
count = json_array_get_count(array); |
||||
fprintf(ctx->file, "[\n"); |
||||
ctx->identation++; |
||||
for (i = 0; i < count; i++) { |
||||
temp_value = json_array_get_value(array, i); |
||||
WriteIdentation(ctx); |
||||
status = json_serialize_to_file_pretty_r(temp_value, ctx); |
||||
if (status != JSONSuccess) |
||||
{ |
||||
return status; |
||||
} |
||||
if (i < (count - 1)) |
||||
fprintf(ctx->file, ",\n"); |
||||
else |
||||
fprintf(ctx->file, "\n"); |
||||
} |
||||
WriteIdentation(ctx); |
||||
fprintf(ctx->file, "]"); |
||||
ctx->identation--; |
||||
return JSONSuccess; |
||||
case JSONObject: |
||||
object = json_value_get_object(value); |
||||
count = json_object_get_count(object); |
||||
fprintf(ctx->file, "{\n"); |
||||
ctx->identation++; |
||||
for (i = 0; i < count; i++) { |
||||
key = json_object_get_name(object, i); |
||||
WriteIdentation(ctx); |
||||
json_serialize_string_file(key, ctx); |
||||
fprintf(ctx->file, " : "); |
||||
temp_value = json_object_get_value(object, key); |
||||
json_serialize_to_file_pretty_r(temp_value, ctx); |
||||
if (i < (count - 1)) |
||||
fprintf(ctx->file, ",\n"); |
||||
} |
||||
ctx->identation--; |
||||
fprintf(ctx->file, "\n"); |
||||
WriteIdentation(ctx); |
||||
fprintf(ctx->file, "}"); |
||||
|
||||
return JSONSuccess; |
||||
case JSONString: |
||||
string = json_value_get_string(value); |
||||
json_serialize_string_file(string, ctx); |
||||
return JSONSuccess; |
||||
case JSONBoolean: |
||||
if (json_value_get_boolean(value)) { |
||||
fprintf(ctx->file, "true"); |
||||
} else { |
||||
fprintf(ctx->file, "false"); |
||||
} |
||||
return JSONSuccess; |
||||
case JSONNumber: |
||||
num = json_value_get_number(value); |
||||
if (num == ((double)(int)num)) { /* check if num is integer */ |
||||
fprintf(ctx->file, "%d", (int)num); |
||||
} else { |
||||
fprintf(ctx->file, DOUBLE_SERIALIZATION_FORMAT, num); |
||||
} |
||||
return JSONSuccess; |
||||
case JSONNull: |
||||
fprintf(ctx->file, "null"); |
||||
return JSONSuccess; |
||||
case JSONError: |
||||
return JSONError; |
||||
default: |
||||
return JSONError; |
||||
} |
||||
} |
||||
|
||||
|
||||
JSON_Status json_serialize_to_file_pretty(const JSON_Value *value, const char *filename) { |
||||
JSON_Status return_code = JSONSuccess; |
||||
SerContext ctx; |
||||
|
||||
ctx.identation = 0; |
||||
ctx.file = fopen (filename, "w"); |
||||
if (ctx.file != NULL) |
||||
{ |
||||
json_serialize_to_file_pretty_r(value, &ctx); |
||||
|
||||
if (fclose (ctx.file) == EOF) { |
||||
return_code = JSONFailure; |
||||
} |
||||
} |
||||
return return_code; |
||||
} |
||||
|
||||
int main() |
||||
{ |
||||
JSON_Value *rootValue; |
||||
JSON_Object *root; |
||||
|
||||
JSON_Value *innerValue; |
||||
JSON_Object *inner; |
||||
|
||||
rootValue = json_value_init_object(); |
||||
root = json_value_get_object(rootValue); |
||||
json_object_set_number(root, "val", 11.3); |
||||
|
||||
innerValue = json_value_init_object(); |
||||
inner = json_value_get_object(innerValue); |
||||
json_object_set_number(inner, "a", 1); |
||||
json_object_set_number(inner, "b", 1.2); |
||||
json_object_set_string(inner, "c", "two"); |
||||
json_object_set_boolean(inner, "d", 1); |
||||
json_object_set_boolean(inner, "e", 0); |
||||
|
||||
json_object_set_boolean(inner, "e", 0); |
||||
json_object_set_value(root, "inner", innerValue); |
||||
|
||||
|
||||
{ |
||||
JSON_Value *arrayValue; |
||||
JSON_Array *array; |
||||
double val; |
||||
|
||||
arrayValue = json_value_init_array(); |
||||
array = json_value_get_array(arrayValue); |
||||
for (val = 0.0; val < 10; val += 0.1) |
||||
{ |
||||
json_array_append_number(array, val); |
||||
} |
||||
json_object_set_value(root, "arr", arrayValue); |
||||
} |
||||
|
||||
json_serialize_to_file_pretty(rootValue, "out.json"); |
||||
|
||||
|
||||
json_value_free(rootValue); |
||||
return 0; |
||||
} |
Loading…
Reference in new issue