ASP.NET Core 3.0 System.Text.Json การจัดอันดับกรณีอูฐ


19

ในโครงการ ASP.NET Core 3.0 Web API คุณจะระบุตัวเลือกการเป็นอนุกรมSystem.Text.Jsonเพื่อทำให้เป็นอันดับ / deserialize คุณสมบัติ Pascal Case เพื่อ Camel Case และในทางกลับกันโดยอัตโนมัติได้อย่างไร

รับโมเดลที่มีคุณสมบัติ Pascal Case เช่น:

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

และรหัสที่จะใช้ System.Text.Json เพื่อ deserialize สตริง JSON ให้เป็นประเภทของPersonคลาส:

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

ไม่ต้องทำการดีซีเรียลไลซ์สำเร็จเว้นแต่ว่าJsonPropertyNameจะใช้กับแต่ละคุณสมบัติเช่น:

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

ฉันลองสิ่งต่อไปนี้ในstartup.csแต่ก็ไม่ได้ช่วยในแง่ของความต้องการยังคง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;
        });

คุณจะตั้ง Camel Case เป็นอนุกรม / deserialize ใน ASP.NET Core 3.0 ได้อย่างไรโดยใช้ System.Text.Json namespace ใหม่

ขอบคุณ!

คำตอบ:


25

AddJsonOptions()จะกำหนดค่าSystem.Text.Jsonสำหรับ MVC เท่านั้น หากคุณต้องการใช้JsonSerializerในรหัสของคุณเองคุณควรผ่านการกำหนดค่าไป

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

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

ไม่มีวิธีระบุตัวเลือกการทำให้เป็นอนุกรมสำหรับโครงการ / แอปพลิเคชันทั้งหมดด้วย System.Text.Json? นี่เป็นเรื่องเล็กน้อยก่อนที่ System.Text.Json
Alexander Staroselsky

ฉันไม่คิดอย่างนั้น คุณต้องผ่านการตั้งค่า
Kahbazi


11

ใน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); 

หมายความว่าคุณไม่จำเป็นต้องนำเข้า newtonsoft.json

ตัวเลือกอื่นสำหรับเท่านั้นoptions.JsonSerializerOptions.PropertyNamingPolicyคือ JsonNamingPolicy.CamelCaseดูเหมือนจะไม่มีJsonNamingPolicyตัวเลือกนโยบายการตั้งชื่ออื่น ๆเช่น snake_case หรือ PascalCase


สิ่งนี้ใช้ได้สำหรับฉัน FTR ฉันไม่มี. AddMvc () ในบริการของฉันก่อนหน้านี้เพิ่มเฉพาะเพื่อเพิ่ม AddJsonOptions ปัญหาการทำให้เป็นอันดับเซิร์ฟเวอร์ - ไคลเอนต์ของฉันหายไป .....
ทำเครื่องหมาย Lazz

10

PropertyNameCaseInsensitiveคุณสามารถใช้ คุณจำเป็นต้องผ่านมันเป็นพารามิเตอร์ไปยัง deserializer

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

ซึ่ง (จากเอกสาร ):

รับหรือตั้งค่าที่กำหนดว่าชื่อของคุณสมบัติใช้การเปรียบเทียบแบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ในระหว่างการดีซีเรียลไลซ์เซชัน ค่าเริ่มต้นเป็นเท็จ

ดังนั้นจึงไม่ได้ระบุ camelCase หรือ PascalCase แต่จะใช้การเปรียบเทียบแบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ไม่แน่ใจว่าสิ่งนี้ตรงตามความต้องการของคุณหรือไม่


หมายเหตุ:ฉันไม่สามารถตั้งค่าแอปพลิเคชันนี้ได้กว้างในแอปคอนโซล ดังที่ระบุไว้ในคำตอบของ Kahbazi services.AddMvc().AddJsonOptionsและservices.AddControllers().AddJsonOptionsจะกำหนดค่าตัวควบคุม Json สำหรับ MVC และ WebApi เท่านั้น (เช่นจะไม่กำหนดค่าแอปพลิเคชันการตั้งค่า Json แบบกว้างในแอปคอนโซลเป็นต้น) ด้านล่างนี้จะกำหนดค่า System.Text.Json สำหรับ Json ที่ผ่านจุดสิ้นสุดของคอนโทรลเลอร์เท่านั้น:

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

6

หากคุณต้องการให้ CamelCase ต่อเนื่องใช้รหัสนี้ในStartup.cs : (ตัวอย่างเช่น FirstName)

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

หากคุณต้องการให้ซีเรียลไลซ์เซสของ PascalCase ใช้รหัสนี้ในStartup.cs : (ตัวอย่างเช่น FirstName)

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

4

คุณยังสามารถตั้งค่าแอปพลิเคชันได้กว้างโดยติดตั้ง Microsoft.AspNetCore.Mvc.NewtonsoftJson Nuget Package ซึ่งช่วยให้คุณสามารถใช้ Json serializer ก่อนหน้าได้:

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

เพิ่มเครดิตให้กับ Poke พบคำตอบได้ที่นี่: IMVCBuilder AddJsonOptions อยู่ที่ไหนใน. Net Core 3.0

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.