JSON_service.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import sys
  2. sys.path.append("wrappers")
  3. from modelverse 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. print("Decoded %s" % json_str)
  60. elif mode == "encode":
  61. service_set(port, "OK")
  62. json_data = fetch_data()
  63. json_str = json.dumps(json_data)
  64. service_set(port, json_str)
  65. print("Encoded %s" % json_str)
  66. else:
  67. raise Exception("No such mode: " + mode)
  68. except Exception as e:
  69. service_set(port, str(e))
  70. raise
  71. print("JSON took %ss" % (time.time() - start))
  72. service_register("JSON", json_service)
  73. try:
  74. while raw_input() != "STOP":
  75. pass
  76. except EOFError:
  77. import time
  78. while 1:
  79. time.sleep(1.0)
  80. finally:
  81. service_stop()