Index: lib/parson.c
===================================================================
--- lib/parson.c	(revision 5726a0d04328035ed1ad8f9a11d1a5029f7df91b)
+++ lib/parson.c	(revision f81d8b84296c11c0a5a7f2727f3cd8c80178a76a)
@@ -27,4 +27,5 @@
 #include "parson.h"
 
+#include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -38,4 +39,5 @@
 #define MAX_NESTING               19
 #define DOUBLE_SERIALIZATION_FORMAT "%f"
+#define JINT_SERIALIZATION_FORMAT "%lld"
 
 #define SIZEOF_TOKEN(a)       (sizeof(a) - 1)
@@ -53,8 +55,11 @@
 #define IS_CONT(b) (((unsigned char)(b) & 0xC0) == 0x80) /* is utf-8 continuation byte */
 
+typedef long long jint;
+
 /* Type definitions */
 typedef union json_value_value {
     const char  *string;
     double       number;
+    jint         integer;
     JSON_Object *object;
     JSON_Array  *array;
@@ -670,12 +675,18 @@
 
 static JSON_Value * parse_number_value(const char **string) {
-    char *end;
-    double number = strtod(*string, &end);
+    char *jint_end, *double_end;
+    double number = strtod(*string, &double_end);
+    jint integer = strtoll(*string, &jint_end, 10);
     JSON_Value *output_value;
-    if (is_decimal(*string, end - *string)) {
-        *string = end;
-        output_value = json_value_init_number(number);
+    if (double_end > jint_end || errno == ERANGE) {
+        if (is_decimal(*string, double_end - *string)) {
+            *string = double_end;
+            output_value = json_value_init_number(number);
+        } else {
+            output_value = NULL;
+        }
     } else {
-        output_value = NULL;
+        *string = jint_end;
+        output_value = json_value_init_integer(integer);
     }
     return output_value;
@@ -700,4 +711,5 @@
     size_t i = 0, count = 0;
     double num = 0.0;
+    jint intnum = 0;
     switch (json_value_get_type(value)) {
         case JSONArray:
@@ -731,8 +743,11 @@
             else
                 return 5; /* strlen("false"); */
+        case JSONInteger:
+            intnum = json_value_get_integer(value);
+            return (size_t)sprintf(buf, JINT_SERIALIZATION_FORMAT, intnum);
         case JSONNumber:
             num = json_value_get_number(value);
-            if (num == ((double)(int)num) ) /*  check if num is integer */
-                return (size_t)sprintf(buf, "%d", (int)num);
+            if (num == ((double)(jint)num) ) /*  check if num is integer */
+                return (size_t)sprintf(buf, JINT_SERIALIZATION_FORMAT, (jint)num);
             return (size_t)sprintf(buf, DOUBLE_SERIALIZATION_FORMAT, num);
         case JSONNull:
@@ -753,4 +768,5 @@
     size_t i = 0, count = 0;
     double num = 0.0;
+    jint intnum = 0;
     switch (json_value_get_type(value)) {
         case JSONArray:
@@ -798,4 +814,8 @@
             }
             return buf;
+        case JSONInteger:
+            intnum = json_value_get_integer(value);
+            PRINTF_AND_SKIP(buf, JINT_SERIALIZATION_FORMAT, intnum);
+            return buf;
         case JSONNumber:
             num = json_value_get_number(value);
@@ -912,4 +932,8 @@
 }
 
+jint json_object_get_integer(const JSON_Object *object, const char *name) {
+    return json_value_get_integer(json_object_get_value(object, name));
+}
+
 double json_object_get_number(const JSON_Object *object, const char *name) {
     return json_value_get_number(json_object_get_value(object, name));
@@ -938,4 +962,8 @@
 const char * json_object_dotget_string(const JSON_Object *object, const char *name) {
     return json_value_get_string(json_object_dotget_value(object, name));
+}
+
+jint json_object_dotget_integer(const JSON_Object *object, const char *name) {
+    return json_value_get_integer(json_object_dotget_value(object, name));
 }
 
@@ -986,4 +1014,8 @@
 }
 
+jint json_array_get_integer(const JSON_Array *array, size_t index) {
+    return json_value_get_integer(json_array_get_value(array, index));
+}
+
 double json_array_get_number(const JSON_Array *array, size_t index) {
     return json_value_get_number(json_array_get_value(array, index));
@@ -1023,6 +1055,22 @@
 }
 
+jint json_value_get_integer(const JSON_Value *value) {
+    if (json_value_get_type(value) == JSONNumber) {
+        return value->value.number;
+    } else if (json_value_get_type(value) == JSONInteger) {
+        return value->value.integer;
+    } else {
+        return 0;
+    }
+}
+
 double json_value_get_number(const JSON_Value *value) {
-    return json_value_get_type(value) == JSONNumber ? value->value.number : 0;
+    if (json_value_get_type(value) == JSONNumber) {
+        return value->value.number;
+    } else if (json_value_get_type(value) == JSONInteger) {
+        return value->value.integer;
+    } else {
+        return 0;
+    }
 }
 
@@ -1090,4 +1138,13 @@
         PARSON_FREE(copy);
     return value;
+}
+
+JSON_Value * json_value_init_integer(jint number) {
+    JSON_Value *new_value = (JSON_Value*)PARSON_MALLOC(sizeof(JSON_Value));
+    if (!new_value)
+        return NULL;
+    new_value->type = JSONInteger;
+    new_value->value.integer = number;
+    return new_value;
 }
 
@@ -1277,4 +1334,15 @@
 }
 
+JSON_Status json_array_replace_integer(JSON_Array *array, size_t i, jint integer) {
+    JSON_Value *value = json_value_init_integer(integer);
+    if (value == NULL)
+        return JSONFailure;
+    if (json_array_replace_value(array, i, value) == JSONFailure) {
+        json_value_free(value);
+        return JSONFailure;
+    }
+    return JSONSuccess;
+}
+
 JSON_Status json_array_replace_number(JSON_Array *array, size_t i, double number) {
     JSON_Value *value = json_value_init_number(number);
@@ -1329,4 +1397,15 @@
 JSON_Status json_array_append_string(JSON_Array *array, const char *string) {
     JSON_Value *value = json_value_init_string(string);
+    if (value == NULL)
+        return JSONFailure;
+    if (json_array_append_value(array, value) == JSONFailure) {
+        json_value_free(value);
+        return JSONFailure;
+    }
+    return JSONSuccess;
+}
+
+JSON_Status json_array_append_integer(JSON_Array *array, jint integer) {
+    JSON_Value *value = json_value_init_integer(integer);
     if (value == NULL)
         return JSONFailure;
@@ -1392,4 +1471,8 @@
 JSON_Status json_object_set_string(JSON_Object *object, const char *name, const char *string) {
     return json_object_set_value(object, name, json_value_init_string(string));
+}
+
+JSON_Status json_object_set_integer(JSON_Object *object, const char *name, jint integer) {
+    return json_object_set_value(object, name, json_value_init_integer(integer));
 }
 
@@ -1439,4 +1522,15 @@
 JSON_Status json_object_dotset_string(JSON_Object *object, const char *name, const char *string) {
     JSON_Value *value = json_value_init_string(string);
+    if (value == NULL)
+        return JSONFailure;
+    if (json_object_dotset_value(object, name, value) == JSONFailure) {
+        json_value_free(value);
+        return JSONFailure;
+    }
+    return JSONSuccess;
+}
+
+JSON_Status json_object_dotset_integer(JSON_Object *object, const char *name, jint integer) {
+    JSON_Value *value = json_value_init_integer(integer);
     if (value == NULL)
         return JSONFailure;
@@ -1663,4 +1757,8 @@
 }
 
+jint json_integer (const JSON_Value *value) {
+    return json_value_get_integer(value);
+}
+
 double json_number (const JSON_Value *value) {
     return json_value_get_number(value);
Index: lib/parson.h
===================================================================
--- lib/parson.h	(revision 5726a0d04328035ed1ad8f9a11d1a5029f7df91b)
+++ lib/parson.h	(revision f81d8b84296c11c0a5a7f2727f3cd8c80178a76a)
@@ -37,8 +37,11 @@
 typedef struct json_value_t  JSON_Value;
 
+typedef long long jint;
+
 enum json_value_type {
     JSONError   = -1,
     JSONNull    = 1,
     JSONString  = 2,
+    JSONInteger = 7,
     JSONNumber  = 3,
     JSONObject  = 4,
@@ -100,4 +103,5 @@
 JSON_Object * json_object_get_object (const JSON_Object *object, const char *name);
 JSON_Array  * json_object_get_array  (const JSON_Object *object, const char *name);
+jint          json_object_get_integer(const JSON_Object *object, const char *name); /* returns 0 on fail */
 double        json_object_get_number (const JSON_Object *object, const char *name); /* returns 0 on fail */
 int           json_object_get_boolean(const JSON_Object *object, const char *name); /* returns -1 on fail */
@@ -111,4 +115,5 @@
 JSON_Object * json_object_dotget_object (const JSON_Object *object, const char *name);
 JSON_Array  * json_object_dotget_array  (const JSON_Object *object, const char *name);
+jint          json_object_dotget_integer(const JSON_Object *object, const char *name); /* returns 0 on fail */
 double        json_object_dotget_number (const JSON_Object *object, const char *name); /* returns 0 on fail */
 int           json_object_dotget_boolean(const JSON_Object *object, const char *name); /* returns -1 on fail */
@@ -123,4 +128,5 @@
 JSON_Status json_object_set_value(JSON_Object *object, const char *name, JSON_Value *value);
 JSON_Status json_object_set_string(JSON_Object *object, const char *name, const char *string);
+JSON_Status json_object_set_integer(JSON_Object *object, const char *name, jint number);
 JSON_Status json_object_set_number(JSON_Object *object, const char *name, double number);
 JSON_Status json_object_set_boolean(JSON_Object *object, const char *name, int boolean);
@@ -130,4 +136,5 @@
 JSON_Status json_object_dotset_value(JSON_Object *object, const char *name, JSON_Value *value);
 JSON_Status json_object_dotset_string(JSON_Object *object, const char *name, const char *string);
+JSON_Status json_object_dotset_integer(JSON_Object *object, const char *name, jint number);
 JSON_Status json_object_dotset_number(JSON_Object *object, const char *name, double number);
 JSON_Status json_object_dotset_boolean(JSON_Object *object, const char *name, int boolean);
@@ -150,4 +157,5 @@
 JSON_Object * json_array_get_object (const JSON_Array *array, size_t index);
 JSON_Array  * json_array_get_array  (const JSON_Array *array, size_t index);
+jint          json_array_get_integer(const JSON_Array *array, size_t index); /* returns 0 on fail */
 double        json_array_get_number (const JSON_Array *array, size_t index); /* returns 0 on fail */
 int           json_array_get_boolean(const JSON_Array *array, size_t index); /* returns -1 on fail */
@@ -162,4 +170,5 @@
 JSON_Status json_array_replace_value(JSON_Array *array, size_t i, JSON_Value *value);
 JSON_Status json_array_replace_string(JSON_Array *array, size_t i, const char* string);
+JSON_Status json_array_replace_integer(JSON_Array *array, size_t i, jint number);
 JSON_Status json_array_replace_number(JSON_Array *array, size_t i, double number);
 JSON_Status json_array_replace_boolean(JSON_Array *array, size_t i, int boolean);
@@ -172,4 +181,5 @@
 JSON_Status json_array_append_value(JSON_Array *array, JSON_Value *value);
 JSON_Status json_array_append_string(JSON_Array *array, const char *string);
+JSON_Status json_array_append_integer(JSON_Array *array, jint number);
 JSON_Status json_array_append_number(JSON_Array *array, double number);
 JSON_Status json_array_append_boolean(JSON_Array *array, int boolean);
@@ -182,4 +192,5 @@
 JSON_Value * json_value_init_array  (void);
 JSON_Value * json_value_init_string (const char *string); /* copies passed string */
+JSON_Value * json_value_init_integer(jint number);
 JSON_Value * json_value_init_number (double number);
 JSON_Value * json_value_init_boolean(int boolean);
@@ -192,4 +203,5 @@
 JSON_Array  *   json_value_get_array  (const JSON_Value *value);
 const char  *   json_value_get_string (const JSON_Value *value);
+jint            json_value_get_integer(const JSON_Value *value);
 double          json_value_get_number (const JSON_Value *value);
 int             json_value_get_boolean(const JSON_Value *value);
@@ -200,4 +212,5 @@
 JSON_Array  *   json_array  (const JSON_Value *value);
 const char  *   json_string (const JSON_Value *value);
+jint            json_integer(const JSON_Value *value);
 double          json_number (const JSON_Value *value);
 int             json_boolean(const JSON_Value *value);
