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

XFEExtension

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

公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/XFEExtension

add-现在支持将Json字符串直接转为可查询的Json节点对象,进行步进查询

0c39779
XFE工作室室长 <mail@xfegzs.com>
提交于

代码差异

12 个文件 +501 -3
Modified XFEExtension.NetCore/XFEExtension.NetCore.csproj +3 -3
@@ -5,7 +5,7 @@
5 5 <ImplicitUsings>enable</ImplicitUsings>
6 6 <Nullable>enable</Nullable>
7 7 <GenerateDocumentationFile>True</GenerateDocumentationFile>
8 <Version>3.0.7</Version>
8 <Version>3.1.0</Version>
9 9 <Title>XFEExtension</Title>
10 10 <RepositoryUrl>https://github.com/XFEstudio/XFEExtension</RepositoryUrl>
11 11 <AnalysisLevel>latest</AnalysisLevel>
@@ -20,11 +20,11 @@
20 20 <PackageTags>XFE;拓展;GPT;Server;服务器;测试;XFEExtension</PackageTags>
21 21 <PackageReleaseNotes>## 调整
22 22
23 修复了MemorableXFEChatGPT接受消息不完整的bug
23
24 24
25 25 ## 新增
26 26
27
27 现在支持将Json字符串直接转为可查询的Json节点对象,进行步进查询
28 28
29 29 ## 严重
30 30
Added XFEExtension.NetCore/XFETransform/JsonConverter/INodeBase.cs +16 -0
@@ -0,0 +1,16 @@
1 namespace XUnitConsole;
2
3 /// <summary>
4 /// 节点根
5 /// </summary>
6 public interface INodeBase
7 {
8 /// <summary>
9 /// 节点层级
10 /// </summary>
11 int Layer { get; set; }
12 /// <summary>
13 /// 节点属性名称
14 /// </summary>
15 string PropertyName { get; set; }
16 }
Added XFEExtension.NetCore/XFETransform/JsonConverter/IQueryableJsonNode.cs +14 -0
@@ -0,0 +1,14 @@
1 namespace XUnitConsole;
2
3 /// <summary>
4 /// 可查询Json节点
5 /// </summary>
6 public interface IQueryableJsonNode
7 {
8 /// <summary>
9 /// 查询节点
10 /// </summary>
11 /// <param name="nodeProperties">查询属性名称或指定操作</param>
12 /// <returns>下一个可查询节点</returns>
13 public QueryableJsonNode this[params string[] nodeProperties] { get; }
14 }
Added XFEExtension.NetCore/XFETransform/JsonConverter/IValueNode.cs +16 -0
@@ -0,0 +1,16 @@
1 namespace XUnitConsole;
2
3 /// <summary>
4 /// 值节点
5 /// </summary>
6 public interface IValueNode
7 {
8 /// <summary>
9 /// 值
10 /// </summary>
11 string Value { get; set; }
12 /// <summary>
13 /// 值类型
14 /// </summary>
15 ValueType ValueType { get; set; }
16 }
Added XFEExtension.NetCore/XFETransform/JsonConverter/JsonComplexPropertyNode.cs +18 -0
@@ -0,0 +1,18 @@
1 namespace XUnitConsole;
2
3 /// <summary>
4 /// Json复杂节点
5 /// </summary>
6 public class JsonComplexPropertyNode : JsonNode, IQueryableJsonNode
7 {
8 ///<inheritdoc/>
9 public QueryableJsonNode this[params string[] nodeProperties] => JsonNodeConverter.AnalyzePropertyArray(nodeProperties, this);
10 /// <summary>
11 /// 是否是列表
12 /// </summary>
13 public bool IsList { get; set; }
14 /// <summary>
15 /// 子节点
16 /// </summary>
17 public List<JsonNode> DescendingNodes { get; set; } = [];
18 }
Added XFEExtension.NetCore/XFETransform/JsonConverter/JsonNode.cs +12 -0
@@ -0,0 +1,12 @@
1 namespace XUnitConsole;
2
3 /// <summary>
4 /// Json节点
5 /// </summary>
6 public class JsonNode : INodeBase
7 {
8 ///<inheritdoc/>
9 public int Layer { get; set; }
10 ///<inheritdoc/>
11 public string PropertyName { get; set; } = string.Empty;
12 }
Added XFEExtension.NetCore/XFETransform/JsonConverter/JsonNodeConverter.cs +255 -0
@@ -0,0 +1,255 @@
1 namespace XUnitConsole;
2
3 /// <summary>
4 /// Json节点转换器
5 /// </summary>
6 /// <param name="jsonString"></param>
7 public class JsonNodeConverter(string jsonString)
8 {
9 private int currentLayer = -1;
10 private string currentPropertyName = "";
11 private string currentPropertyValue = "";
12 private readonly List<short> currentPosition = [0];
13 private string jsonString = jsonString;
14 /// <summary>
15 /// 原始Json字符串
16 /// </summary>
17 public string JsonString
18 {
19 get { return jsonString; }
20 set { jsonString = value; }
21 }
22 /// <summary>
23 /// 转化为Json节点
24 /// </summary>
25 /// <returns></returns>
26 public JsonNode ConvertToJsonNode()
27 {
28 var jsonNode = new JsonComplexPropertyNode();
29 CurrentState currentState = CurrentState.None;
30 JsonSymbol lastSymbol = JsonSymbol.Brace;
31 for (int i = 0; i < jsonString.Length; i++)
32 {
33 var current = jsonString[i];
34 var currentJsonComplexJsonNode = GetJsonNodeByIndex(jsonNode, currentPosition);
35 JsonSymbol currentSymbol;
36 ValueType currentValueType;
37 switch (current)
38 {
39 case '{':
40 currentSymbol = JsonSymbol.Brace;
41 currentState = CurrentState.Property;
42 if (jsonNode.DescendingNodes.Count == 0)
43 break;
44 currentLayer++;
45 if (currentPosition.Count < currentLayer + 2)
46 currentPosition.Add(0);
47 else
48 currentPosition[currentLayer + 1] += 1;
49 var newObjectNode = new JsonComplexPropertyNode
50 {
51 DescendingNodes = [],
52 IsList = false,
53 Layer = currentLayer,
54 PropertyName = currentPropertyName.Replace("\"", "")
55 };
56 currentJsonComplexJsonNode.DescendingNodes.Add(newObjectNode);
57 currentPropertyName = "";
58 currentPropertyValue = "";
59 break;
60 case '}':
61 currentSymbol = JsonSymbol.InvertedBrace;
62 currentState = CurrentState.None;
63 if (lastSymbol == JsonSymbol.Text || lastSymbol == JsonSymbol.DoubleQuotationMark)
64 {
65 currentValueType = JudgeValueType(ref currentPropertyValue);
66 currentJsonComplexJsonNode = GetJsonNodeByIndex(jsonNode, currentPosition);
67 if (SummonJsonPropertyNode(currentValueType, currentLayer, currentPropertyName.Replace("\"", ""), currentPropertyValue) is JsonPropertyNode jsonPropertyNode)
68 currentJsonComplexJsonNode.DescendingNodes.Add(jsonPropertyNode);
69 else
70 Console.WriteLine($"设置复杂Json节点失败:{currentLayer}\t{currentPropertyName}\t{currentPropertyValue}");
71 }
72 currentPosition.RemoveAt(currentPosition.Count - 1);
73 currentLayer--;
74 currentPropertyName = "";
75 currentPropertyValue = "";
76 break;
77 case '[':
78 currentLayer++;
79 currentSymbol = JsonSymbol.Bracket;
80 currentState = CurrentState.ListValue;
81 if (currentPosition.Count < currentLayer + 2)
82 currentPosition.Add(0);
83 else
84 currentPosition[currentLayer + 1] += 1;
85 var newListNode = new JsonComplexPropertyNode
86 {
87 DescendingNodes = [],
88 IsList = true,
89 Layer = currentLayer,
90 PropertyName = currentPropertyName.Replace("\"", "")
91 };
92 currentJsonComplexJsonNode.DescendingNodes.Add(newListNode);
93 currentPropertyName = "";
94 currentPropertyValue = "";
95 break;
96 case ']':
97 currentSymbol = JsonSymbol.InvertedBracket;
98 currentState = CurrentState.None;
99 if (lastSymbol == JsonSymbol.Text || lastSymbol == JsonSymbol.DoubleQuotationMark)
100 {
101 currentValueType = JudgeValueType(ref currentPropertyValue);
102 currentJsonComplexJsonNode = GetJsonNodeByIndex(jsonNode, currentPosition);
103 if (SummonJsonPropertyNode(currentValueType, currentLayer, currentPropertyName.Replace("\"", ""), currentPropertyValue) is JsonPropertyNode jsonPropertyNode)
104 currentJsonComplexJsonNode.DescendingNodes.Add(jsonPropertyNode);
105 else
106 Console.WriteLine($"设置复杂Json节点失败:{currentLayer}\t{currentPropertyName}\t{currentPropertyValue}");
107 }
108 currentPosition.RemoveAt(currentPosition.Count - 1);
109 currentLayer--;
110 break;
111 case ':':
112 currentSymbol = JsonSymbol.Colon;
113 currentState = CurrentState.PropertyValue;
114 break;
115 case ',':
116 currentSymbol = JsonSymbol.Comma;
117 currentPosition[currentLayer + 1] += 1;
118 if (currentState != CurrentState.ListValue)
119 currentState = CurrentState.Property;
120 if (lastSymbol == JsonSymbol.Text || lastSymbol == JsonSymbol.DoubleQuotationMark)
121 {
122 currentValueType = JudgeValueType(ref currentPropertyValue);
123 currentJsonComplexJsonNode = GetJsonNodeByIndex(jsonNode, currentPosition);
124 if (SummonJsonPropertyNode(currentValueType, currentLayer, currentPropertyName.Replace("\"", ""), currentPropertyValue) is JsonPropertyNode jsonPropertyNode)
125 currentJsonComplexJsonNode.DescendingNodes.Add(jsonPropertyNode);
126 else
127 Console.WriteLine($"设置复杂Json节点失败:{currentLayer}\t{currentPropertyName}\t{currentPropertyValue}");
128 }
129 currentPropertyName = "";
130 currentPropertyValue = "";
131 break;
132 case '"':
133 currentSymbol = JsonSymbol.DoubleQuotationMark;
134 if (currentState == CurrentState.Property)
135 currentPropertyName += "\"";
136 else if (currentState == CurrentState.PropertyValue)
137 currentPropertyValue += "\"";
138 break;
139 case '\'':
140 currentSymbol = JsonSymbol.QuotationMark;
141 currentState = CurrentState.None;
142 break;
143 default:
144 currentSymbol = JsonSymbol.Text;
145 switch (currentState)
146 {
147 case CurrentState.Property:
148 currentPropertyName += current;
149 break;
150 case CurrentState.PropertyValue:
151 currentPropertyValue += current;
152 break;
153 case CurrentState.ListValue:
154 currentPropertyValue += current;
155 break;
156 case CurrentState.None:
157 break;
158 default:
159 break;
160 }
161 break;
162 }
163 lastSymbol = currentSymbol;
164 }
165 return jsonNode;
166 }
167 private static JsonComplexPropertyNode GetJsonNodeByIndex(JsonComplexPropertyNode jsonComplexPropertyNode, List<short> indexes)
168 {
169 var currentJsonComplexPropertyNode = jsonComplexPropertyNode;
170 for (int i = 0; i < indexes.Count - 1; i++)
171 {
172 short index = indexes[i];
173 if (currentJsonComplexPropertyNode.DescendingNodes[index] is JsonComplexPropertyNode complexPropertyNode)
174 {
175 currentJsonComplexPropertyNode = complexPropertyNode;
176 }
177 }
178 return currentJsonComplexPropertyNode;
179 }
180 private static ValueType JudgeValueType(ref string currentPropertyValue)
181 {
182 if (currentPropertyValue.StartsWith('"'))
183 {
184 currentPropertyValue = currentPropertyValue.Replace("\"", "");
185 return ValueType.Text;
186 }
187 else if (currentPropertyValue.StartsWith('\''))
188 {
189 currentPropertyValue = currentPropertyValue.Replace("'", "");
190 return ValueType.Char;
191 }
192 else if (currentPropertyValue.Contains('.'))
193 {
194 return ValueType.Float;
195 }
196 else if (bool.TryParse(currentPropertyValue, out _))
197 {
198 return ValueType.Boolean;
199 }
200 else if (int.TryParse(currentPropertyValue, out _))
201 {
202 return ValueType.Int;
203 }
204 else
205 {
206 return ValueType.Long;
207 }
208 }
209 private static JsonPropertyNode? SummonJsonPropertyNode(ValueType currentValueType, int currentLayer, string currentPropertyName, string currentPropertyValue)
210 {
211 var jsonPropertyNode = new JsonPropertyNode
212 {
213 Layer = currentLayer,
214 PropertyName = currentPropertyName,
215 Value = currentPropertyValue,
216 ValueType = currentValueType
217 };
218 return jsonPropertyNode;
219 }
220 internal static QueryableJsonNode AnalyzePropertyArray(string[] nodeProperties, JsonComplexPropertyNode jsonComplexPropertyNode)
221 {
222 if (nodeProperties[0].StartsWith("package:", StringComparison.CurrentCultureIgnoreCase))
223 {
224 return nodeProperties[0][8..].ToLowerInvariant() switch
225 {
226 "list" => NodeOperator.PackageInList(nodeProperties[1..], jsonComplexPropertyNode),
227 "object" => NodeOperator.PackageToList(nodeProperties[1..], jsonComplexPropertyNode),
228 _ => throw new InvalidOperationException()
229 };
230 }
231 else
232 {
233 return jsonComplexPropertyNode.DescendingNodes.Find(node => node.PropertyName == nodeProperties[0]) is JsonNode jsonNode ? new(jsonNode) : throw new InvalidOperationException();
234 }
235 }
236 }
237 enum CurrentState
238 {
239 Property,
240 PropertyValue,
241 ListValue,
242 None
243 }
244 enum JsonSymbol
245 {
246 Brace,
247 InvertedBrace,
248 Bracket,
249 InvertedBracket,
250 Comma,
251 Colon,
252 QuotationMark,
253 DoubleQuotationMark,
254 Text
255 }
Added XFEExtension.NetCore/XFETransform/JsonConverter/JsonPropertyNode.cs +12 -0
@@ -0,0 +1,12 @@
1 namespace XUnitConsole;
2
3 /// <summary>
4 /// Json属性节点
5 /// </summary>
6 public class JsonPropertyNode : JsonNode, IValueNode
7 {
8 ///<inheritdoc/>
9 public ValueType ValueType { get; set; } = ValueType.None;
10 ///<inheritdoc/>
11 public string Value { get; set; } = string.Empty;
12 }
Added XFEExtension.NetCore/XFETransform/JsonConverter/NodeOperator.cs +45 -0
@@ -0,0 +1,45 @@
1 namespace XUnitConsole;
2
3 class NodeOperator
4 {
5 public static QueryableJsonNode PackageInList(string[] nodeProperties, JsonComplexPropertyNode jsonComplexPropertyNode)
6 {
7 var valueNodes = new List<Dictionary<string, ValueNode>>();
8 var selectableJsonNode = new QueryableJsonNode(jsonComplexPropertyNode)
9 {
10 InnerValue = valueNodes
11 };
12 foreach (var node in jsonComplexPropertyNode.DescendingNodes)
13 {
14 if (node is JsonComplexPropertyNode complexPropertyNode)
15 {
16 valueNodes.Add([]);
17 foreach (var childNode in complexPropertyNode.DescendingNodes)
18 {
19 if (childNode is JsonPropertyNode jsonPropertyNode && nodeProperties.Contains(jsonPropertyNode.PropertyName))
20 {
21 valueNodes[^1].Add(jsonPropertyNode.PropertyName, new(jsonPropertyNode.Value, jsonPropertyNode.ValueType));
22 }
23 }
24 }
25 }
26 return selectableJsonNode;
27 }
28
29 public static QueryableJsonNode PackageToList(string[] nodeProperties, JsonComplexPropertyNode jsonComplexPropertyNode)
30 {
31 var valueNodes = new Dictionary<string, ValueNode>();
32 var selectableJsonNode = new QueryableJsonNode(jsonComplexPropertyNode)
33 {
34 InnerValue = valueNodes
35 };
36 foreach (var node in jsonComplexPropertyNode.DescendingNodes)
37 {
38 if (node is JsonPropertyNode jsonPropertyNode && nodeProperties.Contains(jsonPropertyNode.PropertyName))
39 {
40 valueNodes.Add(jsonPropertyNode.PropertyName, new(jsonPropertyNode.Value, jsonPropertyNode.ValueType));
41 }
42 }
43 return selectableJsonNode;
44 }
45 }
Added XFEExtension.NetCore/XFETransform/JsonConverter/QueryableJsonNode.cs +91 -0
@@ -0,0 +1,91 @@
1 namespace XUnitConsole;
2
3 /// <summary>
4 /// 可查询节点
5 /// </summary>
6 /// <param name="jsonNode"></param>
7 public class QueryableJsonNode(JsonNode jsonNode) : INodeBase, IQueryableJsonNode
8 {
9 ///<inheritdoc/>
10 public QueryableJsonNode this[params string[] nodeProperties] => OriginalNode is JsonComplexPropertyNode complexPropertyNode ? complexPropertyNode[nodeProperties] : throw new InvalidOperationException("该节点为简单节点,无法继续查找");
11 /// <summary>
12 /// 原始节点
13 /// </summary>
14 public JsonNode OriginalNode { get; } = jsonNode;
15 /// <summary>
16 /// 节点值
17 /// </summary>
18 public object? Value { get => GetValue(); }
19 internal object? InnerValue { get; set; }
20 /// <summary>
21 /// 节点列表
22 /// </summary>
23 public List<string> List { get => GetList(); }
24 /// <summary>
25 /// 值类型
26 /// </summary>
27 public ValueType ValueType { get => OriginalNode is IValueNode valueNode ? valueNode.ValueType : ValueType.None; }
28 ///<inheritdoc/>
29 public int Layer { get => OriginalNode.Layer; set => OriginalNode.Layer = value; }
30 ///<inheritdoc/>
31 public string PropertyName { get => OriginalNode.PropertyName; set => OriginalNode.PropertyName = value; }
32 /// <summary>
33 /// 获取当前节点值
34 /// </summary>
35 /// <returns>节点值</returns>
36 public object? GetValue() => OriginalNode is IValueNode valueNode ? GetValueByValueType(valueNode.Value, valueNode.ValueType) : null;
37 /// <summary>
38 /// 通过值类型获取值
39 /// </summary>
40 /// <param name="value">值</param>
41 /// <param name="valueType">值类型</param>
42 /// <returns></returns>
43 /// <exception cref="NotImplementedException"></exception>
44 public static object? GetValueByValueType(string value, ValueType valueType) => valueType switch
45 {
46 ValueType.None => null,
47 ValueType.Text => value,
48 ValueType.Char => char.Parse(value),
49 ValueType.Boolean => bool.Parse(value),
50 ValueType.Int => int.Parse(value),
51 ValueType.Long => long.Parse(value),
52 ValueType.Float => float.Parse(value),
53 _ => throw new NotImplementedException()
54 };
55 /// <summary>
56 /// 使用指定类型获取值
57 /// </summary>
58 /// <typeparam name="T">目标类型</typeparam>
59 /// <returns></returns>
60 public T GetValue<T>() => (T)Value!;
61 /// <summary>
62 /// 获取列表
63 /// </summary>
64 /// <returns></returns>
65 /// <exception cref="NullReferenceException"></exception>
66 public List<string> GetList() => OriginalNode is JsonComplexPropertyNode jsonComplexPropertyNode ? jsonComplexPropertyNode.DescendingNodes.Select(node => node is IValueNode valueNode ? valueNode.Value : null!).ToList() : throw new NullReferenceException();
67 /// <summary>
68 /// 使用指定类型获取列表
69 /// </summary>
70 /// <typeparam name="T">指定类型</typeparam>
71 /// <returns></returns>
72 /// <exception cref="NullReferenceException"></exception>
73 public List<T> GetList<T>() => OriginalNode is JsonComplexPropertyNode jsonComplexPropertyNode ? jsonComplexPropertyNode.DescendingNodes.Select(node => node is IValueNode valueNode ? (T)GetValueByValueType(valueNode.Value, valueNode.ValueType)! : default!).ToList() : throw new NullReferenceException();
74 /// <summary>
75 /// 对列表内对象属性值进行打包
76 /// </summary>
77 /// <returns></returns>
78 /// <exception cref="NullReferenceException"></exception>
79 public List<Dictionary<string, ValueNode>> PackageInListObject() => InnerValue is List<Dictionary<string, ValueNode>> innerValue ? innerValue : throw new NullReferenceException();
80 /// <summary>
81 /// 对对象内对象属性值进行打包
82 /// </summary>
83 /// <returns></returns>
84 /// <exception cref="NullReferenceException"></exception>
85 public Dictionary<string, ValueNode> PackageObject() => InnerValue is Dictionary<string, ValueNode> innerValue ? innerValue : throw new NullReferenceException();
86 /// <summary>
87 /// 隐式将Json字符串转换为可查询节点
88 /// </summary>
89 /// <param name="jsonString"></param>
90 public static implicit operator QueryableJsonNode(string jsonString) => new(new JsonNodeConverter(jsonString).ConvertToJsonNode());
91 }
Added XFEExtension.NetCore/XFETransform/JsonConverter/ValueNode.cs +7 -0
@@ -0,0 +1,7 @@
1 namespace XUnitConsole;
2
3 public class ValueNode(string value, ValueType valueType) : IValueNode
4 {
5 public string Value { get; set; } = value;
6 public ValueType ValueType { get; set; } = valueType;
7 }
Added XFEExtension.NetCore/XFETransform/JsonConverter/ValueType.cs +12 -0
@@ -0,0 +1,12 @@
1 namespace XUnitConsole;
2
3 public enum ValueType
4 {
5 None,
6 Text,
7 Char,
8 Boolean,
9 Int,
10 Long,
11 Float
12 }