Handle invalid numbers

Previously cJSON generated invalid JSON when a number was infinite or
similar. This patch changes the behaviour to match javascript, that is
to render such a number as null.
This commit is contained in:
Linus Wallgren 2015-10-01 17:18:29 +02:00
parent affedd65ba
commit e4b96fa820
2 changed files with 7 additions and 3 deletions

View File

@ -166,7 +166,8 @@ static char *print_number(cJSON *item,printbuffer *p)
else str=(char*)cJSON_malloc(64); /* This is a nice tradeoff. */ else str=(char*)cJSON_malloc(64); /* This is a nice tradeoff. */
if (str) if (str)
{ {
if (fabs(floor(d)-d)<=DBL_EPSILON && fabs(d)<1.0e60)sprintf(str,"%.0f",d); if (fpclassify(d) != FP_ZERO && !isnormal(d)) sprintf(str,"null");
else if (fabs(floor(d)-d)<=DBL_EPSILON && fabs(d)<1.0e60) sprintf(str,"%.0f",d);
else if (fabs(d)<1.0e-6 || fabs(d)>1.0e9) sprintf(str,"%e",d); else if (fabs(d)<1.0e-6 || fabs(d)>1.0e9) sprintf(str,"%e",d);
else sprintf(str,"%f",d); else sprintf(str,"%f",d);
} }

3
test.c
View File

@ -131,6 +131,9 @@ void create_objects()
out=cJSON_Print(root); cJSON_Delete(root); printf("%s\n",out); free(out); out=cJSON_Print(root); cJSON_Delete(root); printf("%s\n",out); free(out);
root=cJSON_CreateObject();
cJSON_AddNumberToObject(root,"number", 1.0/0.0);
out=cJSON_Print(root); cJSON_Delete(root); printf("%s\n",out); free(out);
} }
int main (int argc, const char * argv[]) { int main (int argc, const char * argv[]) {