簡體   English   中英

如何使用 .net 內核和 JsonSerializer 自定義序列化 json

[英]How to custom serialise json with .net core and JsonSerializer

我的實現返回一個字符串,其中 json 屬性名字符串被轉義。 這與 json 格式不匹配,並帶來了一些問題。 有沒有辦法使用 JsonSerializer,或者我是否必須像 Microsoft 文檔中建議的那樣手動構建 output 屬性。

所以我的序列化似乎有效,但將其放入正確的 json 格式似乎失敗了。

        public override void Write(Utf8JsonWriter writer, IMyInterface value, JsonSerializerOptions options)
        {
            switch (value)
            {
                case Implementation1 i1:
                    writer.WriteStringValue(JsonSerializer.Serialize(i1, options));
                    return;
                case Implementation2 i2:
                    writer.WriteStringValue(JsonSerializer.Serialize(i2, options));
                    return;
                case Implementation3 i3:
                    writer.WriteStringValue(JsonSerializer.Serialize(i3, options));
                    break;
            }
        }

這是結果的一部分,例如: ["{\"propertyName\":null,...

更新:

我更新了建議的 JsonSerializer 選項,以便它不會在我的Startup.cs中的ConfigureServices中像這樣編碼,這似乎無法解決問題。

            services.AddMvc().AddJsonOptions(opts =>
            {
                opts.JsonSerializerOptions.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping;
            });

正如@GeorgeSquair 已經解釋的那樣, JsonSerializer.Serialize()將我的 object 轉換為 json 字符串並將值傳遞給 writer.WriteStringValue writer.WriteStringValue()將重復此操作,從而導致 Z534F19BE86FF67169CEABBF80 名稱。 我檢查了JsonSerializer.Serialize()的參數,發現我可以將 writer 作為參數傳入,從而正確解決了這個問題。

public override void Write(Utf8JsonWriter writer, IMyInterface value, JsonSerializerOptions options)
        {
            switch (value)
            {
                case Implementation1 i1:
                    JsonSerializer.Serialize(writer, i1, options);
                    return;
                case Implementation2 i2:
                    JsonSerializer.Serialize(writer, i2, options);
                    return;
                case Implementation3 i3:
                    JsonSerializer.Serialize(writer, i3, options);
                    break;
            }
        }

當你調用JsonSerializer.Serialize()你的 object 被轉換成一個字符串,代表 json。

接下來將此調用的結果傳遞給 writer.WriteStringValue writer.WriteStringValue()將寫入一個字符串值作為 json,這反過來將是 escaping 字符串中的字符,您已經序列化為 Z466DEEC76ECDF5FCA6D38571F6324D5。

嘗試改用JsonSerializerOptions

JsonSerializer.Serialize(i1, new JsonSerializerOptions() { WriteIndented = true });

也許您應該閱讀文檔。

WriteStringValue(String) :將字符串文本值(作為 JSON 字符串)寫入 JSON 數組的元素。

您可能想要WriteString(String, String) :將指定為字符串的屬性名稱和字符串文本值(作為 JSON 字符串)作為 JSON ZA8CFDE6331BD59EB62AC96F8911 的名稱/值對的一部分寫入

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM