@@ -67,6 +67,15 @@ def __str__(self, items_separator=",") -> str:
6767 return self .__prepare_msg (items_separator = items_separator )
6868
6969 def to_json (self ) -> str :
70+ Item (
71+ kind = ItemTypes .METRIC_ITEM ,
72+ name = item ["m" ],
73+ metric = MetricDataItem (
74+ data_type = data_type ,
75+ value = val ,
76+ ),
77+ )
78+ )
7079 self .__str__ ()
7180 return IoTextItemDataBuilder .to_json_from_iotext_struct (self .output )
7281
@@ -194,3 +203,90 @@ def from_json(json_iotext_msg) -> List[Item]:
194203 )
195204 )
196205 return items
206+
207+ """
208+ @staticmethod
209+ def parse_integer(value):
210+ return MetricDataTypes.INTEGER, int(value)
211+
212+ @staticmethod
213+ def parse_bool(value):
214+ return MetricDataTypes.BOOL, value == "1"
215+
216+ @staticmethod
217+ def parse_decimal(value):
218+ return MetricDataTypes.DECIMAL, Decimal(str(value))
219+
220+ @staticmethod
221+ def parse_text(value):
222+ return MetricDataTypes.TEXT, str(value)
223+
224+ @staticmethod
225+ def parse_decimals_list(value):
226+ return MetricDataTypes.DECIMALS_LIST, MetricDataItemCodec.from_values_list(MetricDataTypes.DECIMALS_LIST, value)
227+
228+ @staticmethod
229+ def parse_bools_list(value):
230+ return MetricDataTypes.BOOLS_LIST, MetricDataItemCodec.from_values_list(MetricDataTypes.BOOLS_LIST, value)
231+
232+ @staticmethod
233+ def parse_integers_list(value):
234+ return MetricDataTypes.INTEGERS_LIST, MetricDataItemCodec.from_values_list(MetricDataTypes.INTEGERS_LIST, value)
235+
236+ @staticmethod
237+ def parse_texts_list(value):
238+ return MetricDataTypes.TEXTS_LIST, MetricDataItemCodec.from_values_list(MetricDataTypes.TEXTS_LIST, value)
239+
240+ @staticmethod
241+ def handle_multi_key_item(item):
242+ parsers = {
243+ "i": IoTextItemDataBuilder.parse_integer,
244+ "b": IoTextItemDataBuilder.parse_bool,
245+ "d": IoTextItemDataBuilder.parse_decimal,
246+ "t": IoTextItemDataBuilder.parse_text,
247+ "D": IoTextItemDataBuilder.parse_decimals_list,
248+ "B": IoTextItemDataBuilder.parse_bools_list,
249+ "I": IoTextItemDataBuilder.parse_integers_list,
250+ "T": IoTextItemDataBuilder.parse_texts_list
251+ }
252+
253+ data_type, val = parsers\
254+ .get(item["t"], lambda _: (_ for _ in ())\
255+ .throw(ValueError(f"Not recognized metric type: '{item['t']}'")))(item["v"])
256+
257+ return data_type, val
258+
259+ @staticmethod
260+ def handle_single_key_item(item, items) -> List[Item]:
261+ key = next(iter(item))
262+ val = list(item.values())[0]
263+ if key == "t":
264+ return items.append(Item(kind=ItemTypes.TIMESTAMP_MILIS, name=val, metric=None))
265+ elif key == "d":
266+ return items.append(Item(kind=ItemTypes.DEVICE_ID, name=val, metric=None))
267+ elif key == "c":
268+ return items.append(Item(kind=ItemTypes.CRC, name=val, metric=None))
269+ else:
270+ raise ValueError(f"Not recognized type item in keys: '{key}'")
271+
272+ @staticmethod
273+ def from_json(json_iotext_msg) -> List[Item]:
274+ data_row_from_json = json.loads(json_iotext_msg)
275+ items = []
276+ for item in data_row_from_json:
277+ if len(item.keys()) == 1:
278+ items = IoTextItemDataBuilder.handle_single_key_item(item, items)
279+ else:
280+ data_type, val = IoTextItemDataBuilder.handle_multi_key_item(item)
281+ items.append(
282+ Item(
283+ kind=ItemTypes.METRIC_ITEM,
284+ name=item["m"],
285+ metric=MetricDataItem(
286+ data_type=data_type,
287+ value=val,
288+ ),
289+ )
290+ )
291+ return items
292+ """
0 commit comments