json.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import pika_cjson as cjson
  2. def _cjson_encode(cjson: cjson.cJSON):
  3. if cjson == None:
  4. return None
  5. elif cjson.isInvalid():
  6. return None
  7. elif cjson.isFalse():
  8. return False
  9. elif cjson.isTrue():
  10. return True
  11. elif cjson.isNull():
  12. return None
  13. elif cjson.isNumber():
  14. return cjson.getValueDouble()
  15. elif cjson.isString():
  16. return cjson.getValueString()
  17. elif cjson.isArray():
  18. res = []
  19. for i in range(cjson.getArraySize()):
  20. res.append(_cjson_encode(cjson.getArrayItem(i)))
  21. return res
  22. elif cjson.isObject():
  23. res = {}
  24. child = cjson.getChild()
  25. for i in range(cjson.getArraySize()):
  26. key = child.getString()
  27. res[key] = _cjson_encode(child)
  28. child = child.getNext()
  29. return res
  30. elif cjson.isRaw():
  31. return cjson.getString()
  32. else:
  33. return None
  34. def loads(json: str) -> dict:
  35. cj = cjson.Parse(json)
  36. return _cjson_encode(cj)
  37. def _cjson_decode(d: dict):
  38. if d == None:
  39. return cjson.Null()
  40. elif type(d) == int:
  41. return cjson.Number(d)
  42. elif type(d) == float:
  43. return cjson.Number(d)
  44. elif type(d) == bool:
  45. if d:
  46. return cjson.True_()
  47. else:
  48. return cjson.False_()
  49. elif type(d) == str:
  50. return cjson.String(d)
  51. elif type(d) == list:
  52. res = cjson.Array()
  53. for i in d:
  54. res.addItemToArray(_cjson_decode(i))
  55. return res
  56. elif type(d) == dict:
  57. res = cjson.Object()
  58. for k, v in d.items():
  59. res.addItemToObject(k, _cjson_decode(v))
  60. return res
  61. else:
  62. return cjson.Null()
  63. def dumps(d: dict) -> str:
  64. return _cjson_decode(d).print()