Files
XRLib/Assets/Scripts/UVC/Data/Mqtt/MqttDataPicker.cs
2025-09-23 20:40:31 +09:00

85 lines
4.0 KiB
C#

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