我正在使用 System.Text.Json,現在,我正在嘗試弄清楚如何在不反序列化的情況下對 JsonArray 進行排序,如果可能的話。我已經能夠讓其他 LINQ 函式與 JsonArrays 一起作業,但是,我似乎無法讓 OrderBy 作業,而且我嘗試過的所有操作都出現編譯錯誤。
當我將var設定為排序陣列的結果時,VS 說它是:
IOrderedEnumerable<JsonNode>
VS 不允許我將此型別轉換為 JsonArray。如果我使用JsonArray而不是var,那么我會得到紅色的波浪線并且錯誤說:
CS0029: Cannot implicitly convert type 'System.Linq.IOrderedEnumerable<System.Text.Json.Nodes.JsonNode>' to System.Text.Json.Nodes.JsonArray
我一直在環顧四周,但在對 JsonArrays 進行排序時運氣不佳。這甚至可能嗎?
以下是我嘗試過的一些事情:
private void SortArrayTest(JsonArray arrayToSort)
{
var sortedArray0 = arrayToSort.OrderBy(x => x["Name"].ToString());
JsonArray sortedArray1 = arrayToSort.OrderBy(x => x["Name"]);
JsonArray sortedArray2 = arrayToSort.OrderBy(x => x["Name"].ToString());
JsonArray sortedArray3 = arrayToSort.OrderBy(x => x["Name"].ToString()).ToArray();
JsonArray sortedArray4 = arrayToSort.OrderBy(x => x["Name"].ToString()).ToList();
JsonArray sortedArray5 = arrayToSort.OrderBy(x => x["Name"].ToString()).ToList<string>();
JsonArray sortedArray6 = arrayToSort.OrderBy(x => (string)x["Name"]).ToArray();
}
uj5u.com熱心網友回復:
試試這個
private JsonArray SortArrayTest(JsonArray arrayToSort)
{
return (JsonArray) Nodes.JsonArray.Parse(JsonSerializer
.Serialize(arrayToSort.OrderBy(x => (string) x["Name"])));
}
恕我直言,最好使用 Newtonsoft.Json。在這種情況下,您的代碼會更加簡單易讀
private JArray SortArrayTest(JArray arrayToSort)
{
return JArray.FromObject(arrayToSort.OrderBy(x => (string)x["Name"]));
}
uj5u.com熱心網友回復:
Enumerable.OrderBy()不對傳入的序列進行就地排序。相反,它回傳一個新IEnumerable<T>的,當迭代時,按所需順序回傳原始序列的專案。因此,要修改您的內容,您JsonArray必須清除它并重新添加訂購的專案,如下所示:
private static void SortArrayTest(JsonArray arrayToSort)
{
var sortedList = arrayToSort.OrderBy(x => x["Name"].ToString()).ToList();
arrayToSort.Clear();
foreach (var item in sortedList)
arrayToSort.Add(item);
}
或者,如果您希望創建一個新陣列并保持原始陣列不變,您可以通過JsonSerializer.SerializeToNode()如下方式序列化有序列舉:
private static JsonArray SortNewArrayTest(JsonArray arrayToSort) =>
JsonSerializer.SerializeToNode(arrayToSort.OrderBy(x => x["Name"].ToString())).AsArray();
筆記:
A通過其屬性
JsonNode知道其父容器(JsonArray或)。因此,一個給定的人不可能同時屬于兩個父母。JsonObjectParentJsonNode這就解釋了為什么有必要將有序列舉序列化為新的節點序列,而不是簡單地將有序列舉物體化為一個陣列并
JsonArray從中創建一個包含現有節點的新陣列。JsonSerializer.SerializeToNode()(.NET 6 中的新功能)相當于 Newtonsoft 的JToken.FromObject().
演示小提琴在這里。
uj5u.com熱心網友回復:
你們中的一些人就如何直接對 JsonArray 進行排序提供了一些非常有用的評論,并且在嘗試了這些建議之后,雖然它們確實有效,但將 JsonArray 反序列化為 C# 串列的處理時間似乎要快得多,然后排序,然后重新序列化回 Json。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/473557.html
標籤:C# 数组 json 林克 system.text.json
