Helpex - Trao đổi & giúp đỡ Đăng nhập
36

Thay vì điều này:

JsonSerializerOptions options = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
    // etc.
};
var so = 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
var soA = JsonSerializer.Deserialize<SomeObject>(someJsonString); 

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

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

Như đã chỉ ra trong q & a 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à cái này .

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


36 hữu ích 4 bình luận 13k xem chia sẻ
11

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

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

11 hữu ích 0 bình luận chia sẻ
13

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 thay vì phải xây dựng các cài đặt đặc biệt, để tất cả các cài đặt sẽ nằm ở một vị trí duy nhất và có thể 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ó như một phương thức trên một chuỗi, cho dù là chữ hay một biến.

    Car result = @"{""Wheels"": 4, ""Doors"": 2}".DeserializeFeatureX<Car>();
13 hữu ích 0 bình luận chia sẻ
9

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 đi cho 5.0.

Dự kiến sẽ phát hành .NET 5.0 vào tháng 11 năm 2020. Nhưng không có gì đảm bảo rằng vấn đề cụ thể này sẽ được giải quyết vào bất kỳ thời điểm cụ thể 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:

Ngoài ra, tôi đã đóng gói các phương pháp mở rộng tiện lợi của mình, lấy cảm hứng từ câu trả lời của @ ps2goat và đưa chúng lên nuget.orggithub :

9 hữu ích 0 bình luận chia sẻ
7

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

((JsonSerializerOptions)typeof(JsonSerializerOptions)
    .GetField("s_defaultOptions", 
        System.Reflection.BindingFlags.Static |
        System.Reflection.BindingFlags.NonPublic).GetValue(null))
    .PropertyNameCaseInsensitive = true;
7 hữu ích 2 bình luận chia sẻ
5

Điều này dường như hiệu quả với tôi, trong StartUp.ConfigureServices:

services.AddControllers().AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
        options.JsonSerializerOptions.PropertyNamingPolicy=JsonNamingPolicy.CamelCase;
    });
5 hữu ích 2 bình luận chia sẻ
0

(Nếu bạn 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 DefaultSettings .

JsonConvert.DefaultSettings = () => MySuperJsonSerializerSettings;

và sau đó

var json = JsonConvert.SerializeObject(o1);
var o2 = JsonConvert.DeserializeObject(x);
0 hữu ích 1 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ c# json serialization .net-core system.text.json , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading