ASP.NET Core 3.0 System.Text.Json Lạc đà nối tiếp


19

Trong dự án API Web ASP.NET Core 3.0, làm thế nào để bạn chỉ định các tùy chọn tuần tự hóa System.Text.Json để tuần tự hóa / giải tuần tự hóa các thuộc tính Pascal Case cho Camel Case và ngược lại?

Đưa ra một mô hình với các thuộc tính Trường hợp Pascal như:

public class Person
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
}

Và mã để sử dụng System.Text.Json để giải tuần tự hóa một chuỗi JSON thành loại Personlớp:

var json = "{\"firstname\":\"John\",\"lastname\":\"Smith\"}";
var person = JsonSerializer.Deserialize<Person>(json);

Không khử lưu thành công trừ khi JsonPropertyName được sử dụng với mỗi thuộc tính như:

public class Person
{
    [JsonPropertyName("firstname")
    public string Firstname { get; set; }
    [JsonPropertyName("lastname")
    public string Lastname { get; set; }
}

Tôi đã thử những điều sau đây startup.cs, nhưng nó không giúp ích gì trong việc vẫn cần JsonPropertyName:

services.AddMvc().AddJsonOptions(options =>
{
    options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase;
    options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
});

// also the following given it's a Web API project

services.AddControllers().AddJsonOptions(options => {
    options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase;
    options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
        });

Làm cách nào bạn có thể thiết lập serialization / deserialize của Camel Case trong ASP.NET Core 3.0 bằng cách sử dụng không gian tên System.Text.Json mới?

Cảm ơn!

Câu trả lời:


25

AddJsonOptions()sẽ System.Text.Jsonchỉ cấu hình cho MVC. Nếu bạn muốn sử dụng JsonSerializermã riêng của mình, bạn nên chuyển cấu hình cho nó.

var options = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
};

var json = "{\"firstname\":\"John\",\"lastname\":\"Smith\"}";
var person = JsonSerializer.Parse<Person>(json, options);

Không có cách nào để chỉ định các tùy chọn tuần tự hóa cho toàn bộ dự án / ứng dụng với System.Text.Json? Điều này là tầm thường trước System.Text.Json
Alexander Staroselsky

Tôi không nghĩ vậy. Bạn cần phải vượt qua các cài đặt
Kahbazi


11

Trong startup.cs:

// keeps the casing to that of the model when serializing to json (default is converting to camelCase)
services.AddMvc()
    .AddJsonOptions(options => options.JsonSerializerOptions.PropertyNamingPolicy = null); 

Điều này có nghĩa là bạn không cần nhập newtonsoft.json.

Lựa chọn duy nhất khác options.JsonSerializerOptions.PropertyNamingPolicyJsonNamingPolicy.CamelCase. Dường như không có bất kỳ JsonNamingPolicytùy chọn chính sách đặt tên nào khác , chẳng hạn như Snake_case hoặc PascalCase.


Điều này làm việc cho tôi. FTR, tôi không có .AddMvc () trong các dịch vụ của mình trước đây, chỉ thêm nó để AddJsonOptions có thể được thêm vào. Tất cả các sự cố nối tiếp máy chủ-máy khách của tôi đã biến mất .....
Mark Lazz

10

Bạn có thể sử dụng PropertyNameCaseInsensitive. Bạn cần truyền nó dưới dạng tham số cho trình giải nén.

var json = "{\"firstname\":\"John\",\"lastname\":\"Smith\"}";
var options = new JsonSerializerOptions() { PropertyNameCaseInsensitive = true };
var person = JsonSerializer.Deserialize<Person>(json, options);

Mà (từ các tài liệu ):

Nhận hoặc đặt một giá trị xác định xem tên của một thuộc tính có sử dụng so sánh không phân biệt chữ hoa chữ thường trong quá trình khử lưu huỳnh hay không. Giá trị mặc định là sai

Vì vậy, nó không chỉ định camelCase hoặc PascalCase nhưng nó sẽ sử dụng so sánh không phân biệt chữ hoa chữ thường. Không chắc chắn nếu điều này đáp ứng yêu cầu của bạn.


Lưu ý: Tôi không thể đặt ứng dụng này rộng rãi trong ứng dụng bảng điều khiển. Như đã lưu ý trong câu trả lời của Kahbazi services.AddMvc().AddJsonOptionsservices.AddControllers().AddJsonOptionssẽ chỉ định cấu hình bộ điều khiển Json cho MVC và WebApi (ví dụ: sẽ không định cấu hình ứng dụng cài đặt Json rộng trong ứng dụng bảng điều khiển). Dưới đây sẽ chỉ cấu hình System.Text.Json cho Json được chuyển qua điểm cuối của bộ điều khiển:

services.AddControllers()
        .AddJsonOptions(options => {
            options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
         }); 

6

Nếu bạn muốn tuần tự hóa CamelCase, hãy sử dụng mã này trong Startup.cs : (ví dụ: FirstName)

services.AddControllers()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
        });

Nếu bạn muốn tuần tự hóa PascalCase, hãy sử dụng mã này trong Startup.cs : (ví dụ FirstName)

services.AddControllers()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNamingPolicy= null;
        );

4

Bạn vẫn có thể thiết lập ứng dụng rộng rãi bằng cách cài đặt Microsoft.AspNetCore.Mvc.NewtonsoftJson Nuget Gói, cho phép bạn sử dụng triển khai serializer Json trước đó:

services.AddControllers()
        .AddNewtonsoftJson(options =>
        {
            options.SerializerSettings.ContractResolver = new DefaultContractResolver();
        });

Tín dụng cho Poke, câu trả lời được tìm thấy ở đây: IMvcBuilder AddJsonOptions đã đi đâu trong .Net Core 3.0?

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.