การแปลงรหัส newtonsoft เป็น System.Text.Json ใน. net core 3 สิ่งที่เทียบเท่ากับ JObject.Parse และ JsonProperty


12

ฉันกำลังแปลงการใช้งาน newtonsoft เป็นไลบรารี JSON ใหม่ใน. net core 3.0 ฉันมีรหัสต่อไปนี้

public static bool IsValidJson(string json)
{
    try
    {                
        JObject.Parse(json);
        return true;
    }
    catch (Exception ex)
    {
        Logger.ErrorFormat("Invalid Json Received {0}", json);
        Logger.Fatal(ex.Message);
        return false;
    }
}

ฉันไม่สามารถหาสิ่งที่เทียบเท่าได้ JObject.Parse(json);

นอกจากนี้สิ่งที่จะJsonPropertyเทียบเท่าคุณลักษณะ

public class ResponseJson
{
    [JsonProperty(PropertyName = "status")]
    public bool Status { get; set; }
    [JsonProperty(PropertyName = "message")]
    public string Message { get; set; }
    [JsonProperty(PropertyName = "Log_id")]
    public string LogId { get; set; }
    [JsonProperty(PropertyName = "Log_status")]
    public string LogStatus { get; set; }

    public string FailureReason { get; set; }
}

Formating.Noneอีกสิ่งหนึ่งที่ผมจะมองหาเทียบเท่า


สิ่งที่ฉันเข้าใจสำหรับระดับง่ายๆคือ json ตรงไปตรงมาจริงๆ สำหรับสิ่งที่เราใช้ json ซ้อนกันบางรูปแบบเวลาค่าเริ่มต้นสร้าง json โดยตรงพจนานุกรม ฯลฯ เราต้องดูแลและทำการทดสอบหน่วยที่เหมาะสมสำหรับการเปรียบเทียบผลลัพธ์ก่อนและหลังการแปลง
Kamran Shahid

คำตอบ:


15

คุณกำลังถามคำถามสองสามข้อที่นี่:

  1. ฉันไม่สามารถหาสิ่งที่เทียบเท่าได้ JObject.Parse(json);

    คุณสามารถใช้JsonDocumentเพื่อแยกและตรวจสอบ JSON ใด ๆ RootElementเริ่มต้นด้วย องค์ประกอบรากเป็นชนิดJsonElementซึ่งหมายถึงค่า JSON ใด ๆ (ดั้งเดิมหรือไม่) และสอดคล้องกับ JTokenNewtonsoft

    แต่ไม่รับทราบของเอกสารฉบับนี้ข้อสังเกต :

    คลาสนี้ใช้ทรัพยากรจากหน่วยความจำพูลเพื่อลดผลกระทบของตัวรวบรวมขยะ (GC) ในสถานการณ์การใช้งานสูง ความล้มเหลวในการกำจัดวัตถุนี้อย่างถูกต้องจะส่งผลให้หน่วยความจำไม่ได้ถูกส่งกลับไปยังกลุ่มซึ่งจะเพิ่มผลกระทบ GC ทั่วส่วนต่าง ๆ ของกรอบ

    เมื่อคุณต้องการใช้JsonElementนอกอายุการใช้งานของเอกสารคุณต้องโคลน :

    ได้รับที่สามารถเก็บไว้ได้อย่างปลอดภัยเกินอายุการใช้งานของเดิมJsonElementJsonDocument

    โปรดทราบว่าJsonDocumentขณะนี้เป็นแบบอ่านอย่างเดียวและไม่มี API สำหรับการสร้างหรือแก้ไข JSON มีปัญหาแบบเปิด# 39922: Json DOM แบบเขียนได้ติดตามสิ่งนี้

    ตัวอย่างของการใช้มีดังนี้:

    //https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8#using-declarations 
    using var doc = JsonDocument.Parse(json);
    
    //Print the property names.
    var names = doc.RootElement.EnumerateObject().Select(p => p.Name);
    Console.WriteLine("Property names: {0}", string.Join(",", names)); // Property names: status,message,Log_id,Log_status,FailureReason
    
    //Re-serialize with indentation.
    using var ms = new MemoryStream();
    using (var writer = new Utf8JsonWriter(ms, new JsonWriterOptions { Indented = true }))
    {
        doc.WriteTo(writer);
    }
    var json2 = Encoding.UTF8.GetString(ms.GetBuffer(), 0, checked((int)ms.Length));
    
    Console.WriteLine(json2);
  2. นอกจากนี้สิ่งที่จะJsonPropertyเทียบเท่าคุณลักษณะ?

    แอตทริบิวต์ที่สามารถควบคุมJsonSerializerจะถูกวางไว้ในSystem.Text.Json.Serializationnamespace JsonAttributeและสืบทอดจากชั้นฐานนามธรรม ซึ่งแตกต่างจากJsonPropertyไม่มีคุณสมบัติรถโดยสารที่สามารถควบคุมทุกด้านของการเป็นอันดับของคุณสมบัติ มีคุณลักษณะเฉพาะเพื่อควบคุมลักษณะเฉพาะ

    ในฐานะ. NET Core 3 เหล่านี้รวมถึง:

    • [JsonPropertyNameAttribute(string)]:

      ระบุชื่อคุณสมบัติที่มีอยู่ใน JSON เมื่อซีเรียลไลซ์และดีซีเรียลไลซ์ JsonNamingPolicyนโยบายนี้จะแทนที่การตั้งชื่อตามที่ระบุไว้

      นี่คือแอททริบิวต์ที่คุณต้องการใช้เพื่อควบคุมชื่อที่เป็นอนุกรมของResponseJsonคลาสของคุณ:

      public class ResponseJson
      {
          [JsonPropertyName("status")]
          public bool Status { get; set; }
          [JsonPropertyName("message")]
          public string Message { get; set; }
          [JsonPropertyName("Log_id")]
          public string LogId { get; set; }
          [JsonPropertyName("Log_status")]
          public string LogStatus { get; set; }
      
          public string FailureReason { get; set; }
      }
    • [JsonConverterAttribute(Type)]:

      เมื่อวางไว้บนชนิดตัวแปลงที่ระบุจะถูกนำมาใช้ยกเว้นว่าตัวแปลงที่เข้ากันได้นั้นถูกเพิ่มเข้าไปในJsonSerializerOptions.Convertersคอลเลกชันหรือมีตัวอื่นJsonConverterAttributeอยู่ในคุณสมบัติของชนิดเดียวกัน

      โปรดทราบว่าลำดับความสำคัญที่เป็นเอกสารของตัวแปลง - คุณสมบัติในคุณสมบัติจากนั้นคอลเลกชันของตัวแปลงในตัวเลือกจากนั้นคุณสมบัติของประเภท - แตกต่างจากลำดับเอกสารสำหรับตัวแปลง Newtonsoftซึ่งเป็นJsonConverter ที่กำหนดโดยแอตทริบิวต์ในสมาชิกแล้ว JsonConverter ถูกกำหนดโดยแอ็ตทริบิวต์ในคลาสและในที่สุดก็มีผู้แปลงที่ส่งไปยัง JsonSerializer

    • [JsonExtensionDataAttribute] - สอดคล้องกับของ Newtonsoft [JsonExtensionData]Newtonsoft

    • [JsonIgnoreAttribute] - สอดคล้องกับของ Newtonsoft [JsonIgnore]Newtonsoft

  3. เมื่อเขียน JSON ผ่านUtf8JsonWriterการเยื้องสามารถควบคุมได้โดยการตั้งค่าJsonWriterOptions.Indentedการหรือtruefalse

    เมื่อทำให้เป็นอนุกรมกับ JSON ผ่านJsonSerializer.Serializeการเยื้องสามารถควบคุมได้โดยการตั้งค่าJsonSerializerOptions.WriteIndentedการหรือtruefalse

สาธิตซอนี่แสดงเป็นอันดับด้วยและแยกกับJsonSerializerJsonDocument


ขอบคุณ @ dbc ดูเหมือนว่า JsonDocument.Parse จะทำงานให้ฉันสำหรับ JObject และ JsonPropertyName สำหรับสิ่งอื่น ๆ จะแปลงใบสมัครของฉันในวันพรุ่งนี้และจะตรวจสอบ อีกสิ่งหนึ่งที่ฉันจะมองหาเท่ากับ Formating.None ขอบคุณ
Kamran Shahid

ขอบคุณมาก @ dbc
Kamran Shahid

2

ลิงค์นี้ควรจะให้คุณไปซึ่งตัวอย่างที่ฉันคัดลอกด้านล่าง

https://devblogs.microsoft.com/dotnet/try-the-new-system-text-json-apis/

WeatherForecast Deserialize(string json) { var options = new JsonSerializerOptions { AllowTrailingCommas = true }; return JsonSerializer.Parse<WeatherForecast>(json, options); } class WeatherForecast { public DateTimeOffset Date { get; set; } // Always in Celsius. [JsonPropertyName("temp")] public int TemperatureC { get; set; } public string Summary { get; set; } // Don't serialize this property. [JsonIgnore] public bool IsHot => TemperatureC >= 30; }


-1

คุณสามารถติดตั้งแพ็คเกจอื่นของคุณในเวอร์ชันเดียวกันได้

  Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson 

แล้วก็

services.AddControllers().AddNewtonsoftJson();

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