#nullable enable using MessagePack; using System; using System.Collections.Generic; using System.Linq; using UnityEngine; using UVC.Json; namespace UVC.Data.Mqtt { /// /// 미리 정의된 키를 기반으로 JSON 문자열에서 특정 값을 추출합니다. /// /// 이 클래스는 JSON 문자열을 파싱하고 지정된 키와 연관된 값을 검색하도록 설계되었습니다. /// 키는 클래스 인스턴스화 과정에서 제공됩니다. JSON 문자열에서 키를 찾을 수 없거나 JSON 문자열이 유효하지 않은 경우, /// 메서드는 을 반환합니다. public class MqttDataPicker { private bool enableMessagePack; public bool EnableMessagePack { get { return enableMessagePack; } } private string DataKeyName; /// /// 지정된 데이터 키 이름으로 클래스의 새 인스턴스를 초기화합니다. /// /// MQTT 메시지에서 데이터를 식별하는 데 사용할 데이터 키의 이름입니다. 이 값은 null이거나 /// 비어 있을 수 없습니다. /// MessaePack deserialize를 사용할 것인지 여부 public MqttDataPicker(string dataKeyName, bool enableMessagePack = false) { DataKeyName = dataKeyName; this.enableMessagePack = enableMessagePack; } /// /// JSON 문자열에서 특정 키와 연관된 값을 추출합니다. /// /// 이 메서드는 제공된 JSON 문자열을 구문 분석하여 값을 검색하려고 시도합니다 /// 로 정의된 키에 해당합니다. JSON이 형식이 올바르지 않거나 해당 키를 포함하지 않는 경우 /// 지정된 키에 대해 메서드는 을 반환합니다. /// 구문 분석할 JSON 형식의 문자열입니다. null이거나 비어서는 안 됩니다. /// 로 지정된 키와 연관된 값, 또는 키가 없는 경우 /// 키를 찾을 수 없거나 입력이 유효하지 않습니다. public string? PickData(string json) { //Newton JSON에서 변경 된 형태라, [123, 123] 형태의 messagePack 데이터가 [value:123, value:123] 형태로 변경 string jsonString = json; try { if (enableMessagePack) { var msgPackObj = JsonHelper.FromJson>(json); if (msgPackObj.ContainsKey("type") && msgPackObj.TryGetValue("data", out object? dataObj) && dataObj != null) { string byteString = dataObj.ToString(); List byteList = JsonHelper.FromJson>(byteString); byte[] bytes = byteList.Select(v => (byte)v).ToArray(); Dictionary? obj = MessagePackSerializer.Deserialize>(bytes); if (obj != null) { jsonString = JsonHelper.ToJson(obj); } } } var jsonObj = JsonHelper.FromJson>(jsonString); if (jsonObj.TryGetValue(DataKeyName, out var value)) { return value?.ToString(); } } catch (Exception ex) { Debug.LogError($"MqttDataPicker: PickData exception: {ex.Message}. {jsonString}"); } return null; } } }