track/src/SJZY.Track.Application/Helpers/TextJsonHelper.cs

175 lines
5.2 KiB
C#

using System.Globalization;
using System.Text.Json;
namespace SJZY.Track.Application.Helpers;
/// <summary>
/// 针对 Text.Json 的一些辅助方法
/// </summary>
public static class TextJsonHelper
{
public static string? Serialize(object? obj)
{
return obj == null ? default : System.Text.Json.JsonSerializer.Serialize(obj);
}
public static T? Deserialize<T>(string? json)
{
return string.IsNullOrWhiteSpace(json) ? default : System.Text.Json.JsonSerializer.Deserialize<T>(json);
}
public static Dictionary<string, object?>? DeserializeDictionary(string? dictJsonString)
{
return string.IsNullOrWhiteSpace(dictJsonString)
? null
: System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, object?>>(dictJsonString);
}
/// <summary>
/// 获取JsonElement字符串表达的值
/// </summary>
/// <param name="el"></param>
/// <returns></returns>
public static string? GetString(object? el)
{
if (el is not JsonElement jsonElement)
return default;
return jsonElement.ValueKind switch
{
JsonValueKind.Undefined or JsonValueKind.Null => default,
JsonValueKind.True or JsonValueKind.False => jsonElement.GetBoolean().ToString(),
JsonValueKind.Object or JsonValueKind.Array or JsonValueKind.Number => jsonElement.GetRawText(),
JsonValueKind.String => jsonElement.GetString(),
_ => default
};
}
/// <summary>
/// 提取字典字符串中某个字段的值
/// </summary>
/// <param name="dictString">字典json字符串</param>
/// <param name="fieldName"></param>
/// <returns></returns>
public static object? ExtractValue(string? dictString, string fieldName)
{
if (string.IsNullOrWhiteSpace(dictString))
{
return null;
}
var dict = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, object?>>(dictString);
if (dict == null || !dict.TryGetValue(fieldName, out var value))
{
return null;
}
return value;
}
/// <summary>
/// 两个jsonElement进行比较
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
public static bool EqJsonElement(object? a, object? b)
{
if (a == null && b == null)
{
return true;
}
if (a is JsonElement aJsonElement && b is JsonElement bJsonElement)
{
return aJsonElement.ToString() == bJsonElement.ToString();
}
return false;
}
/// <summary>
/// jsonElement和object之间的比较
/// </summary>
/// <param name="jsonElement"></param>
/// <param name="obj"></param>
/// <returns></returns>
public static bool EqJsonElementAndObject(object? jsonElement, object? obj)
{
if (jsonElement == null && obj == null)
{
return true;
}
if (jsonElement is JsonElement aJsonElement)
{
switch (aJsonElement.ValueKind)
{
case JsonValueKind.Undefined:
return false;
case JsonValueKind.Object:
return false;
case JsonValueKind.Array:
return false;
case JsonValueKind.String:
return string.Equals(aJsonElement.GetString(), obj as string);
case JsonValueKind.Number:
{
if (obj == null) return false;
if (obj is int bInt)
{
var aInt = aJsonElement.GetInt32();
return aInt == bInt;
}
if (obj is long bLong)
{
var aLong = aJsonElement.GetInt64();
return aLong == bLong;
}
return false;
}
case JsonValueKind.True:
case JsonValueKind.False:
{
if (obj is bool bl)
{
return aJsonElement.GetBoolean() == bl;
}
return false;
}
case JsonValueKind.Null:
{
return false;
}
}
}
return false;
}
/// <summary>
/// 比较两个jsonElement中的的fieldName字段的值
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <param name="fieldName"></param>
/// <returns></returns>
public static bool EqByJsonElementField(object a, object b, string fieldName)
{
if (a is not JsonElement aJsonElement || b is not JsonElement bJsonElement)
return false;
if (aJsonElement.TryGetProperty(fieldName, out var aValue)
&& bJsonElement.TryGetProperty(fieldName, out var bValue))
{
return aValue.ToString() == bValue.ToString();
}
return false;
}
}