85 lines
4.0 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|