#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;
}
}
}