PluginConfig 支持 object 数组

This commit is contained in:
milimoe 2025-06-29 14:57:59 +08:00
parent 2ed01700ef
commit 236c12a5f4
Signed by: milimoe
GPG Key ID: 9554D37E4B8991D0

View File

@ -85,6 +85,18 @@ namespace Milimoe.FunGame.Core.Api.Utility
{ {
if (TryGetValue(key, out object? value) && value != null) if (TryGetValue(key, out object? value) && value != null)
{ {
if (value is T typeValue)
{
return typeValue;
}
if (value is List<object> listValue)
{
return NetworkUtility.JsonDeserialize<T>(NetworkUtility.JsonSerialize(listValue));
}
if (value is Dictionary<object, object> dictValue)
{
return NetworkUtility.JsonDeserialize<T>(NetworkUtility.JsonSerialize(dictValue));
}
return NetworkUtility.JsonDeserialize<T>(value.ToString() ?? ""); return NetworkUtility.JsonDeserialize<T>(value.ToString() ?? "");
} }
return default; return default;
@ -186,10 +198,10 @@ namespace Milimoe.FunGame.Core.Api.Utility
} }
/// <summary> /// <summary>
/// Json数组反序列化的方法。不支持<see cref="object"/>数组 /// JSON 数组反序列化的方法,支持特定类型数组和混合类型数组(包括嵌套对象和数组)
/// </summary> /// </summary>
/// <param name="key"></param> /// <param name="key">字典的键</param>
/// <param name="obj"></param> /// <param name="obj">JSON 数组的枚举器</param>
private void AddValues(string key, JsonElement.ArrayEnumerator obj) private void AddValues(string key, JsonElement.ArrayEnumerator obj)
{ {
List<long> longList = []; List<long> longList = [];
@ -197,34 +209,162 @@ namespace Milimoe.FunGame.Core.Api.Utility
List<decimal> decList = []; List<decimal> decList = [];
List<string> strList = []; List<string> strList = [];
List<bool> bolList = []; List<bool> bolList = [];
foreach (JsonElement array_e in obj) List<object> resultList = [];
// 标记是否为混合类型
bool isMixed = false;
// 记录第一个非 null 元素的类型
JsonValueKind? firstValueKind = null;
foreach (JsonElement arrayElement in obj)
{ {
if (array_e.ValueKind == JsonValueKind.Number && array_e.TryGetInt64(out long longValue)) switch (arrayElement.ValueKind)
{ {
longList.Add(longValue); case JsonValueKind.Number when arrayElement.TryGetInt64(out long longValue):
} longList.Add(longValue);
else if (array_e.ValueKind == JsonValueKind.Number && array_e.TryGetDouble(out double douValue)) resultList.Add(longValue);
{ firstValueKind ??= JsonValueKind.Number;
douList.Add(douValue); if (firstValueKind != JsonValueKind.Number) isMixed = true;
} break;
else if (array_e.ValueKind == JsonValueKind.Number && array_e.TryGetDecimal(out decimal decValue))
{ case JsonValueKind.Number when arrayElement.TryGetDouble(out double doubleValue):
decList.Add(decValue); douList.Add(doubleValue);
} resultList.Add(doubleValue);
else if (array_e.ValueKind == JsonValueKind.String) firstValueKind ??= JsonValueKind.Number;
{ if (firstValueKind != JsonValueKind.Number) isMixed = true;
strList.Add(array_e.GetString() ?? ""); break;
}
else if (array_e.ValueKind == JsonValueKind.True || array_e.ValueKind == JsonValueKind.False) case JsonValueKind.Number when arrayElement.TryGetDecimal(out decimal decimalValue):
{ decList.Add(decimalValue);
bolList.Add(array_e.GetBoolean()); resultList.Add(decimalValue);
firstValueKind ??= JsonValueKind.Number;
if (firstValueKind != JsonValueKind.Number) isMixed = true;
break;
case JsonValueKind.String:
string strValue = arrayElement.GetString() ?? "";
strList.Add(strValue);
resultList.Add(strValue);
firstValueKind ??= JsonValueKind.String;
if (firstValueKind != JsonValueKind.String) isMixed = true;
break;
case JsonValueKind.True:
case JsonValueKind.False:
bool boolValue = arrayElement.GetBoolean();
bolList.Add(boolValue);
resultList.Add(boolValue);
firstValueKind ??= arrayElement.ValueKind;
if (firstValueKind != arrayElement.ValueKind) isMixed = true;
break;
case JsonValueKind.Null:
break;
case JsonValueKind.Object:
Dictionary<string, object> objValue = ParseObject(arrayElement);
resultList.Add(objValue);
isMixed = true;
break;
case JsonValueKind.Array:
List<object> arrayValue = ParseArray(arrayElement);
resultList.Add(arrayValue);
isMixed = true;
break;
default:
isMixed = true;
break;
} }
} }
if (longList.Count > 0) base.Add(key, longList);
if (douList.Count > 0) base.Add(key, douList); // 根据类型一致性选择存储的列表
if (decList.Count > 0) base.Add(key, decList); if (resultList.Count > 0)
if (strList.Count > 0) base.Add(key, strList); {
if (bolList.Count > 0) base.Add(key, bolList); if (!isMixed)
{
// 所有元素类型一致,存储到对应的特定类型列表
switch (firstValueKind)
{
case JsonValueKind.Number when longList.Count == resultList.Count:
base.Add(key, longList);
break;
case JsonValueKind.Number when douList.Count == resultList.Count:
base.Add(key, douList);
break;
case JsonValueKind.Number when decList.Count == resultList.Count:
base.Add(key, decList);
break;
case JsonValueKind.String:
base.Add(key, strList);
break;
case JsonValueKind.True:
case JsonValueKind.False:
base.Add(key, bolList);
break;
default:
base.Add(key, resultList); // 包含 null 或未知情况
break;
}
}
else
{
// 混合类型或包含对象/数组,存储为 List<object>
base.Add(key, resultList);
}
}
}
/// <summary>
/// 递归解析 JSON 对象
/// </summary>
private Dictionary<string, object> ParseObject(JsonElement element)
{
Dictionary<string, object> dict = [];
foreach (JsonProperty property in element.EnumerateObject())
{
object? value = property.Value.ValueKind switch
{
JsonValueKind.Number when property.Value.TryGetInt64(out long longValue) => longValue,
JsonValueKind.Number when property.Value.TryGetDouble(out double doubleValue) => doubleValue,
JsonValueKind.Number when property.Value.TryGetDecimal(out decimal decimalValue) => decimalValue,
JsonValueKind.String => property.Value.GetString() ?? "",
JsonValueKind.True => true,
JsonValueKind.False => false,
JsonValueKind.Null => null,
JsonValueKind.Object => ParseObject(property.Value),
JsonValueKind.Array => ParseArray(property.Value),
_ => null
};
if (value != null) dict.Add(property.Name, value);
}
return dict;
}
/// <summary>
/// 递归解析 JSON 数组
/// </summary>
private List<object> ParseArray(JsonElement element)
{
List<object> list = [];
foreach (JsonElement arrayElement in element.EnumerateArray())
{
object? value = arrayElement.ValueKind switch
{
JsonValueKind.Number when arrayElement.TryGetInt64(out long longValue) => longValue,
JsonValueKind.Number when arrayElement.TryGetDouble(out double doubleValue) => doubleValue,
JsonValueKind.Number when arrayElement.TryGetDecimal(out decimal decimalValue) => decimalValue,
JsonValueKind.String => arrayElement.GetString() ?? "",
JsonValueKind.True => true,
JsonValueKind.False => false,
JsonValueKind.Null => null,
JsonValueKind.Object => ParseObject(arrayElement),
JsonValueKind.Array => ParseArray(arrayElement),
_ => null
};
if (value != null) list.Add(value);
}
return list;
} }
} }
} }