欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#中System.Text.Json匿名對(duì)象反序列化

 更新時(shí)間:2023年05月25日 08:22:14   作者:波多爾斯基  
這篇文章主要介紹了System.Text.Json匿名對(duì)象反序列化,下文代碼基于. NET 6,為了代碼整潔,實(shí)際配置了PropertyNameCaseInsensitive = true,本文結(jié)合實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

以前就是一直使用 Newtonsoft.Json 用起來還是挺舒服的。由于 JSON 的應(yīng)用越來越廣,現(xiàn)在. NET Core 都內(nèi)置了 System.Text.Json 可以直接對(duì) JSON 進(jìn)行操作,不過兩個(gè)東西的體驗(yàn)依然有點(diǎn)區(qū)別。

有時(shí)候我們會(huì)遇到的從第三方傳遞過來的 json string 對(duì)象,對(duì)其進(jìn)行解析并不需要所有的字段,只需要一個(gè)目標(biāo)的字段時(shí),可以考慮使用匿名對(duì)象/動(dòng)態(tài)對(duì)象對(duì)其反序列化。

之前的 Newtonsoft.Json 好像直接使用 dynamic,運(yùn)用 JObject 進(jìn)行處理,現(xiàn)在的不是那么容易。下文代碼基于. NET 6,為了代碼整潔,實(shí)際配置了 PropertyNameCaseInsensitive = true,但是下面代碼中并沒有體現(xiàn)。

數(shù)據(jù)

我們定義了如下的類型,并從 OData 獲得了 str 字符串型數(shù)據(jù)。

public readonly static string str = """
        {"@odata.context":"http://localhost:9000/api/v1/$metadata#DataDto","value":[{"id":"0b734ed7-2955-4af4-a902-35dc17871094","timestamp":1684839865920},{"id":"7e285d08-cdb3-4209-8335-0ff9b20d39ef","timestamp":1684836312421}]}
        """;
    public class DataDto
    {
        public string? Id { get; set; }
        public long Timestamp { get; set; }
    }

由于有元數(shù)據(jù),我們無法直接將上面的字符串反序列化為 DataDto 的列表對(duì)象。

自定義類

最簡單的方式,是對(duì)應(yīng)此類對(duì)象,設(shè)計(jì)一個(gè)只用于反序列化的新類。

    public class ODataEnumerableResultWrapper<T>
        where T : class
    {
        public IEnumerable<T> Value { get; set; }
    }
	var meta = JsonSerializer.Deserialize<ODataEnumerableResultWrapper<DataDto>>(str);
	var target = meta.Value;

匿名方式

可以使用 JsonNode 來直接反序列化,并使用類似鍵值對(duì)的形式訪問。

    public static void Main() {
        JsonNode? meta = JsonSerializer.Deserialize<JsonNode>(str);
        //如果直接是簡單的對(duì)象,而不是數(shù)組,可以使用GetValue<T>這種形式。
        var count = meta?["value"]?.Deserialize<IEnumerable<DataDto>>().Count();
        Console.WriteLine(count);
    }
}

注意,這樣的操作和你反序列化為 JsonDocument/JsonElement 并沒有什么本質(zhì)的區(qū)別。

動(dòng)態(tài)方式

由于設(shè)計(jì)區(qū)別,直接使用 dynamic 進(jìn)行反序列化,得到的對(duì)象并不具有一般 dynamic 的性質(zhì)(實(shí)際上是 System.Text.Json.JsonElement 對(duì)象)。因此,我們無法通過的 dynamic 訪問成員的形式進(jìn)行操作。

dynamic meta = JsonSerializer.Deserialize<dynamic>(str);
Console.WriteLine(meta.GetType());
//OUTPUT: System.Text.Json.JsonElement

有 文章 說可以使用 ExpandoOject 實(shí)現(xiàn),但是實(shí)際上無法對(duì)子級(jí)對(duì)象進(jìn)行類似的訪問,因?yàn)楂@取的子級(jí)對(duì)象,實(shí)際上是 JsonElement。

        dynamic meta = JsonSerializer.Deserialize<System.Dynamic.ExpandoObject>(str);
        Console.WriteLine(meta.GetType());
        //System.Dynamic.ExpandoObject
        Console.WriteLine(meta.value);
        //[{"id":"0b734ed7-2955-4af4-a902-35dc17871094","timestamp":1684839865920},{"id":"7e285d08-cdb3-4209-8335-0ff9b20d39ef","timestamp":1684836312421}]
        Console.WriteLine(meta.value.GetType());
        //System.Text.Json.JsonElement

當(dāng)然可以通過自定義序列化的方式操作(見參考),但是這個(gè)辦法與我們的不寫額外代碼的初衷相沖突,因此不考慮了。

參考

到此這篇關(guān)于System.Text.Json匿名對(duì)象反序列化的文章就介紹到這了,更多相關(guān)System.Text.Json反序列化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#使用FileStream復(fù)制一個(gè)任意文件

    C#使用FileStream復(fù)制一個(gè)任意文件

    這篇文章主要為大家詳細(xì)介紹了C#使用FileStream復(fù)制一個(gè)任意文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • C#使用AutoMapper進(jìn)行對(duì)象映射的示例代碼

    C#使用AutoMapper進(jìn)行對(duì)象映射的示例代碼

    AutoMapper 是一個(gè)對(duì)象到對(duì)象映射的庫,可以簡化 DTO (Data Transfer Objects) 和實(shí)體類之間的轉(zhuǎn)換,在大型應(yīng)用程序中,通常需要將業(yè)務(wù)實(shí)體映射到視圖模型或 DTO 中,本文將詳細(xì)介紹如何在 C# 項(xiàng)目中使用 AutoMapper,包括安裝、配置、以及示例代碼
    2024-08-08
  • C#實(shí)現(xiàn)多種圖片格式轉(zhuǎn)換的示例詳解

    C#實(shí)現(xiàn)多種圖片格式轉(zhuǎn)換的示例詳解

    這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)多種圖片格式轉(zhuǎn)換,例如轉(zhuǎn)換成圖標(biāo)圖像ICO,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • C#飛行棋小程序設(shè)計(jì)代碼

    C#飛行棋小程序設(shè)計(jì)代碼

    這篇文章主要為大家詳細(xì)介紹了C#飛行棋小程序設(shè)計(jì)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • C#使用ImitateLogin模擬登錄百度

    C#使用ImitateLogin模擬登錄百度

    這篇文章主要介紹了C#使用ImitateLogin模擬登錄百度 的相關(guān)資料,需要的朋友可以參考下
    2015-12-12
  • C#屬性(Attribute)用法實(shí)例解析

    C#屬性(Attribute)用法實(shí)例解析

    這篇文章主要介紹了C#屬性(Attribute)用法實(shí)例解析,需要的朋友可以參考下
    2014-08-08
  • C#把數(shù)組中的某個(gè)元素取出來放到第一個(gè)位置的實(shí)現(xiàn)方法

    C#把數(shù)組中的某個(gè)元素取出來放到第一個(gè)位置的實(shí)現(xiàn)方法

    這篇文章主要介紹了C#把數(shù)組中的某個(gè)元素取出來放到第一個(gè)位置的實(shí)現(xiàn)方法,涉及C#針對(duì)數(shù)組的常見操作技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-12-12
  • unity中實(shí)現(xiàn)Edge瀏覽器鼠標(biāo)手勢(shì)的功能思路詳解

    unity中實(shí)現(xiàn)Edge瀏覽器鼠標(biāo)手勢(shì)的功能思路詳解

    這篇文章主要介紹了unity中實(shí)現(xiàn)Edge瀏覽器鼠標(biāo)手勢(shì)的功能思路詳解,實(shí)現(xiàn)起來其實(shí)并不復(fù)雜,涉及的技術(shù)點(diǎn)有pc端和移動(dòng)端屏幕拖動(dòng)事件,二維向量的相關(guān)運(yùn)算,手勢(shì)匹配算法,事件系統(tǒng)設(shè)計(jì)模式,需要的朋友可以參考下
    2023-12-12
  • 如何在C#中使用注冊(cè)表

    如何在C#中使用注冊(cè)表

    這篇文章主要介紹了如何在C# 使用注冊(cè)表,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-12-12
  • ToLua框架下C#與Lua代碼的互調(diào)操作

    ToLua框架下C#與Lua代碼的互調(diào)操作

    這篇文章主要介紹了ToLua框架下C#與Lua代碼的互調(diào)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11

最新評(píng)論