Làm cách nào để đặt toàn cầu các tùy chọn mặc định cho System.Text.Json.JsonSerializer?


12

CẬP NHẬT [2019-12-23]: Do một phần do cộng đồng giọng hát nhập vào , vấn đề này đã được thêm vào lộ trình cho .NET 5.0.

CẬP NHẬT [2019-10-10]: Nếu muốn xem hành vi này được thực hiện choSystem.Text.Json.JsonSerializerđối mặt với vấn đề GitHub mở được chỉ ra bởi Chris Yungmann và cân nhắc.


Thay vì điều này:

JsonSerializerOptions options = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
    // etc.
};
JsonSerializer.Deserialize<SomeObject>(someJsonString, options);

Tôi muốn làm một cái gì đó như thế này:

// This property is a pleasant fiction
JsonSerializer.DefaultSettings = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
    // etc.
};

// This uses my options
JsonSerializer.Deserialize<SomeObject>(someJsonString); 

// And somewhere else in the same codebase...
// This also uses my options
JsonSerializer.Deserialize<SomeOtherObject>(someOtherJsonString); 

Hy vọng là không phải vượt qua một trường hợp JsonSerializerOptionscho các trường hợp phổ biến nhất của chúng tôi và ghi đè cho ngoại lệ, không phải là quy tắc.

Như đã nêu trong phần hỏi đáp này , đây là một tính năng hữu ích của Json.Net. Tôi nhìn trong các tài liệu hướng dẫn cho System.Text.Jsoncũng như repo GitHub này cho NET Core. Và này một .

Dường như không có sự tương tự để quản lý mặc định tuần tự hóa JSON trong .NET Core 3. Hay tôi đang xem nó?


There doesn't seem to be an analog for managing JSON serialization defaults in Core-3- bạn đang nói về các yêu cầu vào và ra khỏi API của bạn? hoặc yêu cầu và phản hồi cho các tài nguyên khác?
ps2goat

@ ps2goat Tôi không chắc là tôi hiểu câu hỏi của bạn. Vấn đề ở đây là (de) tuần tự hóa các chuỗi JSON. Họ có thể đến từ bất kỳ số lượng các nguồn.
Trevor Reid

Tôi đã hỏi bởi vì có những vị trí đặc biệt trong quá trình khởi động cho trình định dạng đầu vào và đầu ra (ví dụ: để liên kết mô hình)
ps2goat

À, gotcha. Theo nghĩa đó, tôi nghĩ rằng trường hợp của chúng tôi sẽ thuộc "tài nguyên khác". @ ps2goat
Trevor Reid

Điều đó thực sự đáng buồn, cho đến khi .net core 3.1, vẫn chưa có bộ nối tiếp json tích hợp tốt.
Trò đùa Hoàng

Câu trả lời:


4

Không, JsonSerializerOptionskhông để lộ các tùy chọn mặc định . Nếu bạn đang sử dụng một khung web cụ thể, có thể có một cách để chỉ định (hủy) cài đặt tuần tự hóa thông qua đó. Nếu không, tôi đề nghị tạo ra các phương pháp thuận tiện của riêng bạn.

Xem thêm vấn đề mở này .


3

Bạn có thể tạo một phương thức mở rộng. Đây là một ví dụ

Tôi sử dụng các phương pháp riêng biệt so với việc phải xây dựng các cài đặt đặc biệt, để tất cả các cài đặt sẽ ở một vị trí và dễ dàng sử dụng lại.

public static class DeserializeExtensions
{
    private static JsonSerializerOptions defaultSerializerSettings = new JsonSerializerOptions();

    // set this up how you need to!
    private static JsonSerializerOptions featureXSerializerSettings = new JsonSerializerOptions();


    public static T Deserialize<T>(this string json)
    {       
        return JsonSerializer.Deserialize<T>(json, defaultSerializerSettings);
    }

    public static T DeserializeCustom<T>(this string json, JsonSerializerOptions settings)
    {
        return JsonSerializer.Deserialize<T>(json, settings);
    }

    public static T DeserializeFeatureX<T>(this string json)
    {
        return JsonSerializer.Deserialize<T>(json, featureXSerializerSettings);
    }
}

Sau đó, bạn gọi nó là một phương thức trên một chuỗi, cho dù bằng chữ hay biến.

    Car result = @"{""Wheels"": 4, ""Doors"": 2}".DeserializeFeatureX<Car>();

Ah, bạn là một câu trả lời phụ thuộc Json.Net, tôi nghĩ vậy. Câu hỏi này là về System.Text.Json.JsonSerializerNET Core-3.0 mà không cần phụ thuộc thêm. Cảm ơn.
Trevor Reid

2
Đó là vẻ đẹp của sự trừu tượng. Không có thay đổi mã bên ngoài lớp mở rộng này! Tôi chỉ cập nhật để xây dựng trong System.Text.Json.JsonSerializer. Khái niệm này hoàn toàn giống nhau. Tôi cũng cập nhật liên kết ví dụ.
ps2goat

3

Các tùy chọn mặc định không được hiển thị trong JsonSerializer.NET Core 3.1. Tuy nhiên, kể từ tháng 12 năm 2019, điều này đã được thêm vào bản đồ đường cho 5.0.

Việc phát hành .NET 5.0 dự kiến ​​vào tháng 11 năm 2020. Nhưng không có gì đảm bảo vấn đề cụ thể này sẽ được giải quyết bất cứ lúc nào. Ngoài việc chờ đợi, những câu trả lời này gợi ý cách giải quyết:


2

Một cách giải quyết đã được đề xuất bởi người dùng GitHub vàre-ss6 như sau:

((JsonSerializerOptions)typeof(JsonSerializerOptions)
    .GetField("s_defaultOptions", 
        System.Reflection.BindingFlags.Static |
        System.Reflection.BindingFlags.NonPublic).GetValue(null))
    .PropertyNameCaseInsensitive = true;

-1

(Nếu bạn đã từng chuyển sang sử dụng Json.NET)

Tôi thích và khuyên bạn nên rõ ràng và chuyển cài đặt cho tất cả các cuộc gọi, nhưng bạn có thể đặt mặc định với DefaultSinstall .

JsonConvert.DefaultSettings = () => MySuperJsonSerializerSettings;

và sau đó

var json = JsonConvert.SerializeObject(o1);
var o2 = JsonConvert.DeserializeObject(x);

Câu trả lời và liên kết này của @tymtam áp dụng cho Json.Net. Câu hỏi này liên quan đến hành vi của simialr trong System.Text.Jsonđó tuần tự hóa JSON được đưa vào .NET Core 3.0. Cảm ơn vì đã dành thời gian trả lời.
Trevor Reid
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.