def _decode_token(index, c, full_path, path, name2index, destination, expected_vars): if c == b'{': if not expected_vars: index = jump_to_end(index, c) value = None elif expected_vars[0] == ".": json.mark(index-1) index = jump_to_end(index, c) value = json_decoder(json.release(index).decode("utf8")) else: count = 0 for v, i in _decode_object(index, full_path, path, name2index, destination, expected_vars=expected_vars): index = i value = v count += 1 if count != 1: Log.error("Expecting object, nothing nested") elif c == b'[': if not expected_vars: index = jump_to_end(index, c) value = None else: json.mark(index - 1) index = jump_to_end(index, c) value = json_decoder(json.release(index).decode("utf8")) else: if expected_vars and expected_vars[0] == ".": value, index = simple_token(index, c) else: index = jump_to_end(index, c) value = None return value, index
def simple_token(index, c): if c == b'"': json.mark(index - 1) while True: c = json[index] index += 1 if c == b"\\": index += 1 elif c == b'"': break return json_decoder(json.release(index).decode("utf8")), index elif c in b"{[": Log.error("Expecting a primitive value") elif c == b"t" and json.slice(index, index + 3) == "rue": return True, index + 3 elif c == b"n" and json.slice(index, index + 3) == "ull": return None, index + 3 elif c == b"f" and json.slice(index, index + 4) == "alse": return False, index + 4 else: json.mark(index-1) while True: c = json[index] if c in b',]}': break index += 1 return float(json.release(index)), index
def simple_token(index, c): if c == b'"': json.mark(index - 1) while True: c = json[index] index += 1 if c == b"\\": index += 1 elif c == b'"': break return json_decoder(json.release(index).decode("utf8")), index elif c in b"{[": json.mark(index-1) index = jump_to_end(index, c) value = wrap(json_decoder(json.release(index).decode("utf8"))) return value, index elif c == b"t" and json.slice(index, index + 3) == b"rue": return True, index + 3 elif c == b"n" and json.slice(index, index + 3) == b"ull": return None, index + 3 elif c == b"f" and json.slice(index, index + 4) == b"alse": return False, index + 4 else: json.mark(index-1) while True: c = json[index] if c in b',]}': break index += 1 text = json.release(index) try: return float(text), index except Exception: Log.error("Not a known JSON primitive: {{text|quote}}", text=text)