# coding:utf-8 from odps.udf import annotate import json @annotate("string,string,string->bigint") class kv_in_json_array_position(object): def evaluate(self, json_array_str, key, value): if json_array_str is None or json_array_str == '': return -1 index = 0 json_array = json.loads(json_array_str) for json_item in json_array: if key in json_item and str(json_item[key]) == value: return index index += 1 return -1 @annotate("string,string,string->bigint") class kv_in_json_array_item(object): def evaluate(self, json_array_str, key, value): if json_array_str is None or json_array_str == '': return "" json_array = json.loads(json_array_str) for json_item in json_array: if key in json_item and str(json_item[key]) == value: return json.dumps(json_item) return "" @annotate("string->string") class json_array_path(object): def evaluate(self, json_str): if json_str is None or json_str == '': return None try: arr = [] json_array = json.loads(json_str) for data in json_array: if 'creativeId' in data: arr.append(str(data['creativeId'])) return ",".join(arr) except Exception: return "Internal error"