JSON_service.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. else:
  26. # Is a primitive value (normally), so send as-is
  27. service_set(port, "P")
  28. service_set(port, data)
  29. def fetch_data():
  30. data = service_get(port)
  31. if data == "D":
  32. rval = {}
  33. length = service_get(port)
  34. for _ in range(length):
  35. key = service_get(port)
  36. rval[key] = fetch_data()
  37. elif data == "L":
  38. rval = []
  39. length = service_get(port)
  40. for _ in range(length):
  41. rval.append(fetch_data())
  42. elif data == "P":
  43. rval = service_get(port)
  44. else:
  45. raise Exception("Unknown data type: " + data)
  46. return rval
  47. start = time.time()
  48. mode = service_get(port)
  49. try:
  50. if mode == "decode":
  51. service_set(port, "OK")
  52. json_str = service_get(port)
  53. json_data = json.loads(json_str)
  54. print_out_json(json_data)
  55. elif mode == "encode":
  56. service_set(port, "OK")
  57. json_data = fetch_data()
  58. json_str = json.dumps(json_data)
  59. service_set(port, json_str)
  60. else:
  61. raise Exception("No such mode: " + mode)
  62. except Exception as e:
  63. service_set(port, str(e))
  64. raise
  65. print("JSON took %ss" % (time.time() - start))
  66. service_register("JSON", json_service)
  67. try:
  68. while raw_input() != "STOP":
  69. pass
  70. except EOFError:
  71. import time
  72. while 1:
  73. time.sleep(1.0)
  74. finally:
  75. service_stop()