76 return cJSON_CreateNull();
78 switch( n->getType() ) {
79 case simgear::props::BOOL:
80 return cJSON_CreateBool(n->getBoolValue());
81 case simgear::props::INT:
82 case simgear::props::LONG:
83 case simgear::props::FLOAT:
84 case simgear::props::DOUBLE: {
85 double val = n->getDoubleValue();
86 return SGMiscd::isNaN(val) ? cJSON_CreateNull() : cJSON_CreateNumber(val);
90 return cJSON_CreateString(n->getStringValue().c_str());
95cJSON *
JSON::toJson(SGPropertyNode_ptr n,
int depth,
double timestamp )
97 cJSON * json = cJSON_CreateObject();
98 cJSON_AddItemToObject(json,
"path", cJSON_CreateString(n->getPath(
true).c_str()));
99 cJSON_AddItemToObject(json,
"name", cJSON_CreateString(n->getNameString().c_str()));
100 if( n->hasValue() ) {
101 switch( n->getType() ) {
102 case simgear::props::BOOL:
103 cJSON_AddItemToObject(json,
"value", cJSON_CreateBool(n->getBoolValue()));
105 case simgear::props::INT:
106 case simgear::props::LONG:
107 case simgear::props::FLOAT:
108 case simgear::props::DOUBLE: {
109 double val = n->getDoubleValue();
110 cJSON_AddItemToObject(json,
"value", SGMiscd::isNaN(val) ? cJSON_CreateNull() : cJSON_CreateNumber(val));
114 cJSON_AddItemToObject(json,
"value", cJSON_CreateString(n->getStringValue().c_str()));
119 cJSON_AddItemToObject(json,
"index", cJSON_CreateNumber(n->getIndex()));
120 if( timestamp >= 0.0 )
121 cJSON_AddItemToObject(json,
"ts", cJSON_CreateNumber(timestamp));
122 cJSON_AddItemToObject(json,
"nChildren", cJSON_CreateNumber(n->nChildren()));
124 if (depth > 0 && n->nChildren() > 0) {
125 cJSON * jsonArray = cJSON_CreateArray();
126 for (
int i = 0;
i < n->nChildren();
i++)
127 cJSON_AddItemToArray(jsonArray,
toJson(n->getChild(
i), depth - 1, timestamp ));
128 cJSON_AddItemToObject(json,
"children", jsonArray);
135 if (NULL == json)
return;
137 SGPropertyNode_ptr n = base;
141 cJSON * cj = cJSON_GetObjectItem(json,
"name");
143 const char *
name = cj->valuestring;
147 string namestr = simgear::strutils::strip(
string(
name));
148 if( !namestr.empty() ) {
150 cj = cJSON_GetObjectItem(json,
"index");
151 if (NULL != cj) index = cj->valueint;
152 if (index < 0)
return;
154 n = base->getNode(namestr, index,
true);
158 cJSON * children = cJSON_GetObjectItem(json,
"children");
159 if (NULL != children) {
160 for (
int i = 0;
i < cJSON_GetArraySize(children);
i++) {
161 toProp(cJSON_GetArrayItem(children,
i), n);
164 cj = cJSON_GetObjectItem(json,
"value");
166 switch ( cj->type ) {
168 n->setStringValue(cj->valuestring);
172 n->setDoubleValue(cj->valuedouble);
176 n->setBoolValue(
true);
180 n->setBoolValue(
false);
192 if (NULL == json)
return;
195 cJSON * children = cJSON_GetObjectItem(json,
"children");
196 if (NULL != children) {
197 for (
int i = 0;
i < cJSON_GetArraySize(children);
i++) {
198 toProp(cJSON_GetArrayItem(children,
i), n);