XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEExtension

【DLL】XFE各类拓展是一个C#的DLL库,旨在优化C#代码中常用语句的使用,并提供更简洁的访问方式,同时提供Xunit测试框架,快速搭建服务器/客户端,免费ChatGPTAPI接口,免费通讯服务器,XFE下载器,新增格式等

公开
关注 0 Fork 0 Star 0
UTF-8
namespace XFEExtension.NetCore.XFETransform.JsonConverter;

[Obsolete("请使用 XFEJsonNode.SelectProperties 或 ProjectArray。")]
class NodeOperator
{
    /// <summary>
    /// 从列表型复杂节点的每个子对象中提取指定属性,并打包为对象字典列表。
    /// </summary>
    /// <param name="nodeProperties">需要从每个子对象中提取的属性名称。</param>
    /// <param name="jsonComplexPropertyNode">包含待处理子对象的复杂 JSON 节点。</param>
    /// <returns>保留原始节点并携带已打包对象字典列表的可查询节点。</returns>
    public static QueryableJsonNode PackageInList(string[] nodeProperties, JsonComplexPropertyNode jsonComplexPropertyNode)
    {
        var valueNodes = new List<Dictionary<string, ValueNode>>();
        var selectableJsonNode = new QueryableJsonNode(jsonComplexPropertyNode)
        {
            InnerValue = valueNodes
        };
        foreach (var node in jsonComplexPropertyNode.DescendingNodes)
        {
            if (node is not JsonComplexPropertyNode complexPropertyNode)
                continue;

            valueNodes.Add([]);
            foreach (var childNode in complexPropertyNode.DescendingNodes)
                if (childNode is JsonPropertyNode jsonPropertyNode && nodeProperties.Contains(jsonPropertyNode.PropertyName))
                    valueNodes[^1].Add(jsonPropertyNode.PropertyName, new(jsonPropertyNode.Value, jsonPropertyNode.ValueType));
        }
        return selectableJsonNode;
    }

    /// <summary>
    /// 从复杂节点中提取指定的直接属性,并打包为单个属性字典。
    /// </summary>
    /// <param name="nodeProperties">需要从复杂节点中提取的属性名称。</param>
    /// <param name="jsonComplexPropertyNode">包含待处理属性的复杂 JSON 节点。</param>
    /// <returns>保留原始节点并携带已打包属性字典的可查询节点。</returns>
    public static QueryableJsonNode PackageToList(string[] nodeProperties, JsonComplexPropertyNode jsonComplexPropertyNode)
    {
        var valueNodes = new Dictionary<string, ValueNode>();
        var selectableJsonNode = new QueryableJsonNode(jsonComplexPropertyNode)
        {
            InnerValue = valueNodes
        };
        foreach (var node in jsonComplexPropertyNode.DescendingNodes)
        {
            if (node is JsonPropertyNode jsonPropertyNode && nodeProperties.Contains(jsonPropertyNode.PropertyName))
            {
                valueNodes.Add(jsonPropertyNode.PropertyName, new(jsonPropertyNode.Value, jsonPropertyNode.ValueType));
            }
        }
        return selectableJsonNode;
    }
}