dbutils/json.c

Wed, 25 Mar 2026 20:07:38 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Wed, 25 Mar 2026 20:07:38 +0100
changeset 53
82adacc27b5b
parent 46
96e139ab57f2
permissions
-rw-r--r--

fix null obj is not translated to a json null literal in dbuObjectToJson2

26
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
28
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
4 * Copyright 2025 Olaf Wintermann. All rights reserved.
26
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
41
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
29 #include <stdio.h>
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
30
26
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31 #include "json.h"
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32
41
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
33 /* ---------------- Obj to JSON serialization functions ---------------------*/
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
34
26
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
35 CxJsonValue* dbuObjectToJson(DBUClass *type, void *obj, const CxAllocator *a) {
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
36 return dbuObjectToJson2(type, obj, a, false, false);
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37 }
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
38
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39 CxJsonValue* dbuObjectToJson2(DBUClass *type, void *obj, const CxAllocator *a, bool setNull, bool forceString) {
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
40 if(obj == NULL) {
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41 return cxJsonCreateLiteral(a, CX_JSON_NULL);
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42 }
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
43 if(!a) {
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44 a = cxDefaultAllocator;
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45 }
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47 CxJsonValue *value = cxJsonCreateObj(a);
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48 if(!value) {
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49 return NULL;
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
50 }
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
51
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
52 // add all primitive values
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
53 CxMapIterator i = cxMapIteratorValues(type->fields);
28
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
54 for(int n=0;n<2;n++) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
55 cx_foreach(DBUField *, field, i) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
56 CxJsonValue *child = NULL;
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
57 if(field->toBool) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
58 bool b = field->toBool(field, obj);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
59 child = cxJsonCreateLiteral(a, b ? CX_JSON_TRUE : CX_JSON_FALSE);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
60 } else if(field->toInt64) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
61 int64_t i = field->toInt64(field, obj);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
62 child = cxJsonCreateInteger(a, i);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
63 } else if(field->toUInt64) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
64 uint64_t u = field->toUInt64(field, obj);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
65 child = cxJsonCreateInteger(a, (int64_t)u);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
66 } else if(field->toDouble) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
67 double d = field->toDouble(field, obj);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
68 child = cxJsonCreateNumber(a, d);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
69 } else if(field->toString) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
70 cxmutstr s = field->toString(field, obj, a);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
71 if(s.ptr) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
72 // we don't want to copy the string again, therefore
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
73 // we can't use cxJsonCreateString
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
74 child = cxMalloc(a, sizeof(CxJsonValue));
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
75 if(!child) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
76 cxFree(a, s.ptr);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
77 return NULL;
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
78 }
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
79 child->allocator = a;
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
80 child->type = CX_JSON_STRING;
30
d33eaaec15da update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 29
diff changeset
81 child->string = s;
26
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
82 }
28
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
83 } else if(field->toBinary) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
84 // TODO
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
85 } else if(field->toObject) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
86 DBUObject child_obj = field->toObject(field, obj);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
87 if(child_obj == NULL) {
53
82adacc27b5b fix null obj is not translated to a json null literal in dbuObjectToJson2
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
88 child = cxJsonCreateLiteral(a, CX_JSON_NULL);
28
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
89 } else if(field->objType) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
90 child = dbuObjectToJson2(field->objType, child_obj, a, setNull, forceString);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
91 }
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
92 } else if(field->toList) {
29
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
93 DBUAbstractList *list = field->toList(field, obj);
31
287484519844 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 30
diff changeset
94 child = cxJsonCreateArr(a, list->length(list));
29
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
95 if(child) {
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
96 if(list->iterator) {
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
97 CxIterator iter = list->iterator(list);
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
98 cx_foreach(void *, elm, iter) {
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
99 DBUField *f = list->elementField(list, elm);
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
100 if(f->toObject) {
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
101 DBUObject child_obj = f->toObject(field, elm);
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
102 if(f->objType) {
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
103 CxJsonValue *array_elm = dbuObjectToJson2(f->objType, child_obj, a, setNull, forceString);
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
104 cxJsonArrAddValues(child, &array_elm, 1);
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
105 }
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
106 }
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
107 }
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
108 }
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
109 }
28
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
110 } else {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
111 continue; // non-serializable field
26
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
112 }
28
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
113
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
114 if(!child) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
115 cxJsonValueFree(value);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
116 return NULL;
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
117 }
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
118
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
119 if(cxJsonObjPut(value, field->name, child)) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
120 cxJsonValueFree(child);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
121 cxJsonValueFree(value);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
122 return NULL;
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
123 }
26
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
124 }
28
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
125 i = cxMapIteratorValues(type->obj_fields);
26
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
126 }
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
127
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
128 return value;
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
129 }
41
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
130
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
131
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
132 /* --------------- Json to Obj deserialization functions --------------------*/
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
133
42
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
134 static void* jsonToObj(DBUClass *type, const CxAllocator *a, CxJsonValue *value, int depth, int *error) {
41
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
135 if(!cxJsonIsObject(value)) {
42
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
136 *error = 1;
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
137 return NULL;
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
138 }
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
139 if(depth > DBU_JSON_MAX_DEPTH) {
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
140 *error = 2;
41
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
141 return NULL;
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
142 }
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
143 if(!a) {
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
144 a = cxDefaultAllocator;
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
145 }
42
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
146
41
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
147 void *obj = cxMalloc(a, type->obj_size);
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
148 if(obj) {
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
149 memset(obj, 0, type->obj_size);
42
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
150 } else {
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
151 *error = 3;
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
152 return NULL;
41
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
153 }
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
154
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
155 char buf[64];
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
156 int len = 0;
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
157
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
158 CxMapIterator i = cxMapIterator(value->object);
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
159 cx_foreach(CxMapEntry *, entry, i) {
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
160 DBUField *field = cxMapGet(type->fields, entry->key);
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
161 if(!field) {
42
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
162 field = cxMapGet(type->obj_fields, entry->key);
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
163 if(!field) {
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
164 continue;
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
165 }
41
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
166 }
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
167
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
168 len = 0;
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
169
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
170 CxJsonValue *child = entry->value;
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
171 switch(child->type) {
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
172 case CX_JSON_LITERAL: {
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
173 if(child->literal == CX_JSON_NULL) {
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
174 if(field->initObjValue) {
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
175 field->initObjValue(field, a, obj, NULL);
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
176 }
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
177 break;
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
178 } else {
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
179 int b = child->literal == CX_JSON_TRUE;
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
180 if(field->initIntValue) {
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
181 field->initIntValue(field, a, obj, b);
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
182 continue;
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
183 } else {
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
184 len = snprintf(buf, 64, "%d", b);
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
185 }
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
186 }
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
187 break;
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
188 }
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
189 case CX_JSON_INTEGER: {
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
190 if(field->initIntValue) {
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
191 field->initIntValue(field, a, obj, child->integer);
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
192 } else {
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
193 len = snprintf(buf, 64, "%" PRId64, child->integer);
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
194 }
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
195 break;
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
196 }
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
197 case CX_JSON_NUMBER: {
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
198 if(field->initDoubleValue) {
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
199 field->initDoubleValue(field, a, obj, child->number);
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
200 } else {
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
201 len = snprintf(buf, 64, "%f", child->number);
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
202 }
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
203 break;
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
204 }
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
205 case CX_JSON_STRING: {
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
206 cxmutstr str = child->string;
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
207 if(field->initValue(field, a, obj, str.ptr, str.length)) {
42
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
208 *error = 3;
41
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
209 free(obj); // TODO: improve obj cleanup
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
210 return NULL;
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
211 }
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
212 break;
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
213 }
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
214 case CX_JSON_OBJECT: {
42
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
215 if(field->objType && field->initObjValue) {
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
216 void *child_obj = jsonToObj(field->objType, a, child, depth+1, error);
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
217 if(child_obj) {
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
218 field->initObjValue(field, a, obj, child_obj);
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
219 } else {
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
220 free(obj); // TODO: improve obj cleanup
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
221 return NULL;
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
222 }
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
223 }
41
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
224 break;
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
225 }
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
226 case CX_JSON_ARRAY: {
43
73c1ced3a620 implement deserialization of json objects that contain arrays
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
227 if(field->builder.add) {
73c1ced3a620 implement deserialization of json objects that contain arrays
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
228 for(int i=0;i<child->array.size;i++) {
73c1ced3a620 implement deserialization of json objects that contain arrays
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
229 CxJsonValue *elm = child->array.data[i];
44
3bac2715ccb9 add more json deserialization tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 43
diff changeset
230 void *elm_obj = NULL;
3bac2715ccb9 add more json deserialization tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 43
diff changeset
231 bool add_elm = false;
43
73c1ced3a620 implement deserialization of json objects that contain arrays
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
232 if(cxJsonIsObject(elm)) {
44
3bac2715ccb9 add more json deserialization tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 43
diff changeset
233 elm_obj = jsonToObj(field->builder.type, a, elm, depth+1, error);
43
73c1ced3a620 implement deserialization of json objects that contain arrays
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
234 if(!elm_obj) {
73c1ced3a620 implement deserialization of json objects that contain arrays
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
235 free(obj); // TODO: improve obj cleanup
73c1ced3a620 implement deserialization of json objects that contain arrays
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
236 return NULL;
73c1ced3a620 implement deserialization of json objects that contain arrays
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
237 }
44
3bac2715ccb9 add more json deserialization tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 43
diff changeset
238 add_elm = true;
3bac2715ccb9 add more json deserialization tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 43
diff changeset
239
3bac2715ccb9 add more json deserialization tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 43
diff changeset
240 } else if(cxJsonIsLiteral(elm) && elm->literal == CX_JSON_NULL) {
3bac2715ccb9 add more json deserialization tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 43
diff changeset
241 add_elm = true;
3bac2715ccb9 add more json deserialization tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 43
diff changeset
242 }
3bac2715ccb9 add more json deserialization tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 43
diff changeset
243
3bac2715ccb9 add more json deserialization tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 43
diff changeset
244 if(add_elm) {
43
73c1ced3a620 implement deserialization of json objects that contain arrays
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
245 if(field->builder.add(&field->builder, obj, field->builder.type, elm_obj, NULL, a)) {
73c1ced3a620 implement deserialization of json objects that contain arrays
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
246 free(obj); // TODO: improve obj cleanup
44
3bac2715ccb9 add more json deserialization tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 43
diff changeset
247 free(elm_obj);
43
73c1ced3a620 implement deserialization of json objects that contain arrays
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
248 *error = 3;
73c1ced3a620 implement deserialization of json objects that contain arrays
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
249 return NULL;
73c1ced3a620 implement deserialization of json objects that contain arrays
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
250 }
73c1ced3a620 implement deserialization of json objects that contain arrays
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
251 }
73c1ced3a620 implement deserialization of json objects that contain arrays
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
252 }
73c1ced3a620 implement deserialization of json objects that contain arrays
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 42
diff changeset
253 }
41
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
254 break;
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
255 }
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
256 default: break;
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
257 }
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
258
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
259 if(len > 0) {
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
260 if(field->initValue(field, a, obj, buf, len)) {
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
261 // TODO: completely cleanup obj
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
262 free(obj);
42
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
263 *error = 3;
41
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
264 return NULL;
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
265 }
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
266 }
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
267 }
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
268
42
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
269 *error = 0;
41
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
270 return obj;
daabc9bb5445 implement primitive json to obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 31
diff changeset
271 }
42
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
272
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
273 void* dbuJsonToObject(DBUClass *type, const CxAllocator *a, CxJsonValue *value) {
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
274 int error;
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
275 return jsonToObj(type, a, value, 0, &error);
3c989bc611c6 implement json child obj deserialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 41
diff changeset
276 }
45
a8b1df52e63e add dbuJsonToList
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
277
a8b1df52e63e add dbuJsonToList
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
278 static CxList* jsonToArray(DBUClass *type, const CxAllocator *a, CxJsonValue *value, size_t elmSize, int *error) {
a8b1df52e63e add dbuJsonToList
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
279 if(!cxJsonIsArray(value)) {
a8b1df52e63e add dbuJsonToList
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
280 *error = 1;
a8b1df52e63e add dbuJsonToList
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
281 return NULL;
a8b1df52e63e add dbuJsonToList
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
282 }
a8b1df52e63e add dbuJsonToList
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
283
a8b1df52e63e add dbuJsonToList
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
284 CxList *list = cxArrayListCreate(a, elmSize, value->array.size);
a8b1df52e63e add dbuJsonToList
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
285 if(!list) {
a8b1df52e63e add dbuJsonToList
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
286 *error = 3;
a8b1df52e63e add dbuJsonToList
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
287 }
a8b1df52e63e add dbuJsonToList
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
288
a8b1df52e63e add dbuJsonToList
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
289 for(size_t i=0;i<value->array.size;i++) {
46
96e139ab57f2 add dbuJsonToList tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 45
diff changeset
290 CxJsonValue *elm = value->array.data[i];
96e139ab57f2 add dbuJsonToList tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 45
diff changeset
291 void *elm_obj = NULL;
96e139ab57f2 add dbuJsonToList tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 45
diff changeset
292 if(cxJsonIsObject(elm)) {
96e139ab57f2 add dbuJsonToList tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 45
diff changeset
293 elm_obj = jsonToObj(type, a, elm, 1, error);
96e139ab57f2 add dbuJsonToList tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 45
diff changeset
294 if(!elm_obj) {
96e139ab57f2 add dbuJsonToList tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 45
diff changeset
295 cxListFree(list);
96e139ab57f2 add dbuJsonToList tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 45
diff changeset
296 return NULL;
96e139ab57f2 add dbuJsonToList tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 45
diff changeset
297 }
45
a8b1df52e63e add dbuJsonToList
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
298 }
46
96e139ab57f2 add dbuJsonToList tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 45
diff changeset
299 if(cxListAdd(list, elm_obj)) {
45
a8b1df52e63e add dbuJsonToList
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
300 *error = 3;
a8b1df52e63e add dbuJsonToList
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
301 cxListFree(list);
a8b1df52e63e add dbuJsonToList
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
302 return NULL;
a8b1df52e63e add dbuJsonToList
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
303 }
a8b1df52e63e add dbuJsonToList
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
304 }
a8b1df52e63e add dbuJsonToList
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
305
a8b1df52e63e add dbuJsonToList
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
306 return list;
a8b1df52e63e add dbuJsonToList
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
307 }
a8b1df52e63e add dbuJsonToList
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
308
a8b1df52e63e add dbuJsonToList
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
309 CxList* dbuJsonToList(DBUClass *type, const CxAllocator *a, CxJsonValue *value) {
a8b1df52e63e add dbuJsonToList
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
310 int error;
a8b1df52e63e add dbuJsonToList
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
311 return jsonToArray(type, a, value, CX_STORE_POINTERS, &error);
a8b1df52e63e add dbuJsonToList
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
312 }

mercurial