JSON_service.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import sys
  2. sys.path.append("wrappers")
  3. from modelverse_coded import *
  4. import os
  5. import json
  6. import time
  7. time.sleep(1)
  8. init(sys.argv[1])
  9. login("JSON", "JSON")
  10. def json_service(port):
  11. def print_out_json(data):
  12. if isinstance(data, dict):
  13. # Serialize dictionary
  14. service_set(port, "D")
  15. service_set(port, len(data))
  16. for key, value in data.items():
  17. service_set(port, key)
  18. print_out_json(value)
  19. elif isinstance(data, list):
  20. # Serialize list
  21. service_set(port, "L")
  22. service_set(port, len(data))
  23. for value in data:
  24. print_out_json(value)
  25. elif data is None:
  26. service_set(port, "N")
  27. else:
  28. # Is a primitive value (normally), so send as-is
  29. service_set(port, "P")
  30. service_set(port, data)
  31. def fetch_data():
  32. data = service_get(port)
  33. if data == "D":
  34. rval = {}
  35. length = service_get(port)
  36. for _ in range(length):
  37. key = service_get(port)
  38. rval[key] = fetch_data()
  39. elif data == "L":
  40. rval = []
  41. length = service_get(port)
  42. for _ in range(length):
  43. rval.append(fetch_data())
  44. elif data == "P":
  45. rval = service_get(port)
  46. elif data == "N":
  47. rval = None
  48. else:
  49. raise Exception("Unknown data type: " + data)
  50. return rval
  51. start = time.time()
  52. mode = service_get(port)
  53. try:
  54. if mode == "decode":
  55. service_set(port, "OK")
  56. json_str = service_get(port)
  57. json_data = json.loads(json_str)
  58. print_out_json(json_data)
  59. elif mode == "encode":
  60. service_set(port, "OK")
  61. json_data = fetch_data()
  62. json_str = json.dumps(json_data)
  63. service_set(port, json_str)
  64. else:
  65. raise Exception("No such mode: " + mode)
  66. except Exception as e:
  67. service_set(port, str(e))
  68. raise
  69. print("JSON took %ss" % (time.time() - start))
  70. service_register("JSON", json_service)
  71. try:
  72. while raw_input() != "STOP":
  73. pass
  74. except EOFError:
  75. import time
  76. while 1:
  77. time.sleep(1.0)
  78. finally:
  79. service_stop()