XFEExtension
【DLL】XFE各类拓展是一个C#的DLL库,旨在优化C#代码中常用语句的使用,并提供更简洁的访问方式,同时提供Xunit测试框架,快速搭建服务器/客户端,免费ChatGPTAPI接口,免费通讯服务器,XFE下载器,新增格式等
关注
0
Fork
0
Star
0
返回提交历史
Modified
XFEExtension.NetCore/XFEExtension.NetCore.csproj
+3
-3
Added
XFEExtension.NetCore/XFETransform/JsonConverter/INodeBase.cs
+16
-0
Added
XFEExtension.NetCore/XFETransform/JsonConverter/IQueryableJsonNode.cs
+14
-0
Added
XFEExtension.NetCore/XFETransform/JsonConverter/IValueNode.cs
+16
-0
Added
XFEExtension.NetCore/XFETransform/JsonConverter/JsonComplexPropertyNode.cs
+18
-0
Added
XFEExtension.NetCore/XFETransform/JsonConverter/JsonNode.cs
+12
-0
Added
XFEExtension.NetCore/XFETransform/JsonConverter/JsonNodeConverter.cs
+255
-0
Added
XFEExtension.NetCore/XFETransform/JsonConverter/JsonPropertyNode.cs
+12
-0
Added
XFEExtension.NetCore/XFETransform/JsonConverter/NodeOperator.cs
+45
-0
Added
XFEExtension.NetCore/XFETransform/JsonConverter/QueryableJsonNode.cs
+91
-0
Added
XFEExtension.NetCore/XFETransform/JsonConverter/ValueNode.cs
+7
-0
Added
XFEExtension.NetCore/XFETransform/JsonConverter/ValueType.cs
+12
-0
XFEstudio/XFEExtension
add-现在支持将Json字符串直接转为可查询的Json节点对象,进行步进查询
0c39779
代码差异
12 个文件
+501
-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
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}