| commit c9f8318bd823ae9d44797b6b881a2b3e22cdbade |
| Author: Joakim Hamren <joakim.hamren@gmail.com> |
| Date: Tue Feb 7 02:02:38 2017 +0100 |
| |
| Fix for incorrect order when using OrderedDict |
| |
| diff --git a/python/objToJSON.c b/python/objToJSON.c |
| index abe6588..9e6a390 100644 |
| --- a/python/objToJSON.c |
| +++ b/python/objToJSON.c |
| @@ -253,8 +253,13 @@ static int Dict_iterNext(JSOBJ obj, JSONTypeContext *tc) |
| GET_TC(tc)->itemName = NULL; |
| } |
| |
| + if (!(GET_TC(tc)->itemName = PyIter_Next(GET_TC(tc)->iterator))) |
| + { |
| + PRINTMARK(); |
| + return 0; |
| + } |
| |
| - if (!PyDict_Next ( (PyObject *)GET_TC(tc)->dictObj, &GET_TC(tc)->index, &GET_TC(tc)->itemName, &GET_TC(tc)->itemValue)) |
| + if (!(GET_TC(tc)->itemValue = PyObject_GetItem(GET_TC(tc)->dictObj, GET_TC(tc)->itemName))) |
| { |
| PRINTMARK(); |
| return 0; |
| @@ -295,6 +300,7 @@ static void Dict_iterEnd(JSOBJ obj, JSONTypeContext *tc) |
| Py_DECREF(GET_TC(tc)->itemName); |
| GET_TC(tc)->itemName = NULL; |
| } |
| + Py_CLEAR(GET_TC(tc)->iterator); |
| Py_DECREF(GET_TC(tc)->dictObj); |
| PRINTMARK(); |
| } |
| @@ -425,20 +431,23 @@ static char *SortedDict_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outL |
| |
| static void SetupDictIter(PyObject *dictObj, TypeContext *pc, JSONObjectEncoder *enc) |
| { |
| - if (enc->sortKeys) { |
| + pc->dictObj = dictObj; |
| + if (enc->sortKeys) |
| + { |
| pc->iterEnd = SortedDict_iterEnd; |
| pc->iterNext = SortedDict_iterNext; |
| pc->iterGetValue = SortedDict_iterGetValue; |
| pc->iterGetName = SortedDict_iterGetName; |
| + pc->index = 0; |
| } |
| - else { |
| + else |
| + { |
| pc->iterEnd = Dict_iterEnd; |
| pc->iterNext = Dict_iterNext; |
| pc->iterGetValue = Dict_iterGetValue; |
| pc->iterGetName = Dict_iterGetName; |
| + pc->iterator = PyObject_GetIter(dictObj); |
| } |
| - pc->dictObj = dictObj; |
| - pc->index = 0; |
| } |
| |
| static void Object_beginTypeContext (JSOBJ _obj, JSONTypeContext *tc, JSONObjectEncoder *enc) |
| @@ -446,7 +455,8 @@ static void Object_beginTypeContext (JSOBJ _obj, JSONTypeContext *tc, JSONObject |
| PyObject *obj, *objRepr, *exc; |
| TypeContext *pc; |
| PRINTMARK(); |
| - if (!_obj) { |
| + if (!_obj) |
| + { |
| tc->type = JT_INVALID; |
| return; |
| } |
| diff --git a/tests/tests.py b/tests/tests.py |
| index cd928e6..b7e46af 100644 |
| --- a/tests/tests.py |
| +++ b/tests/tests.py |
| @@ -10,6 +10,8 @@ import json |
| import math |
| import time |
| import pytz |
| +from collections import OrderedDict |
| + |
| if six.PY2: |
| import unittest2 as unittest |
| else: |
| @@ -383,6 +385,10 @@ class UltraJSONTests(unittest.TestCase): |
| input = -float('inf') |
| self.assertRaises(OverflowError, ujson.encode, input) |
| |
| + def test_encodeOrderedDict(self): |
| + input = OrderedDict([(1, 1), (0, 0), (8, 8), (2, 2)]) |
| + self.assertEqual('{"1":1,"0":0,"8":8,"2":2}', ujson.encode(input)) |
| + |
| def test_decodeJibberish(self): |
| input = "fdsa sda v9sa fdsa" |
| self.assertRaises(ValueError, ujson.decode, input) |
| @@ -668,7 +674,7 @@ class UltraJSONTests(unittest.TestCase): |
| d = {u'key': JSONTest()} |
| output = ujson.encode(d) |
| dec = ujson.decode(output) |
| - self.assertEquals(dec, {u'key': output_text}) |
| + self.assertEqual(dec, {u'key': output_text}) |
| |
| def test_object_with_json_unicode(self): |
| # If __json__ returns a string, then that string |
| @@ -681,7 +687,7 @@ class UltraJSONTests(unittest.TestCase): |
| d = {u'key': JSONTest()} |
| output = ujson.encode(d) |
| dec = ujson.decode(output) |
| - self.assertEquals(dec, {u'key': output_text}) |
| + self.assertEqual(dec, {u'key': output_text}) |
| |
| def test_object_with_complex_json(self): |
| # If __json__ returns a string, then that string |
| @@ -694,7 +700,7 @@ class UltraJSONTests(unittest.TestCase): |
| d = {u'key': JSONTest()} |
| output = ujson.encode(d) |
| dec = ujson.decode(output) |
| - self.assertEquals(dec, {u'key': obj}) |
| + self.assertEqual(dec, {u'key': obj}) |
| |
| def test_object_with_json_type_error(self): |
| # __json__ must return a string, otherwise it should raise an error. |