在.net core 3中将newtonsoft代码转换为System.Text.Json。JObject.Parse和JsonProperty等效什么

Kam*_*hid 3 c# serialization json.net .net-core-3.0 system.text.json

我正在将我的newtonsoft实现转换为.net core 3.0中的新JSON库。我有以下代码

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我找不到任何等效的 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; }
}
Run Code Online (Sandbox Code Playgroud)

我将要寻找的另一件事是Formating.None

dbc*_*dbc 6

您在这里问几个问题:

  1. 我找不到任何等效的 JObject.Parse(json);

    您可以JsonDocument用来解析和检查任何JSON。但是千万要注意这个文件的备注

    此类利用池内存中的资源来最大程度地减少高使用率场景中垃圾收集器(GC)的影响。无法正确处理该对象将导致内存没有返回到池中,这将增加GC对框架各个部分的影响。

    还要注意,此类型当前为只读,并且不提供用于创建或修改JSON的API。当前存在一个未解决的问题,问题#39922:可写Json DOM对此进行了跟踪。

    使用示例如下:

    //https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8#using-declarations 
    using var doc = JsonDocument.Parse(json);
    
    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
    
    using var ms = new MemoryStream();
    using (var writer = new Utf8JsonWriter(ms, new JsonWriterOptions { Indented = true }))
    {
        doc.WriteTo(writer);
    }
    var json2 = Encoding.UTF8.GetString(ms.ToArray());
    
    Console.WriteLine(json2);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 同样,JsonProperty等效属性是什么?

    可以控制的属性JsonSerializer放置在System.Text.Json.Serialization名称空间中。与不同JsonProperty,没有omnibus属性可以控制属性序列化的所有方面。而是有特定的属性来控制特定的方面。

    从.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; }
      }
      
      Run Code Online (Sandbox Code Playgroud)
    • [JsonConverterAttribute(Type)]

      当放置在类型上时,将使用指定的转换器,除非将兼容的转换器添加到JsonSerializerOptions.Converters集合中,或者JsonConverterAttribute在同一类型的属性上存在另一个转换器。

      请注意,转换器的记录优先级(属性之前的设置)与牛顿软件转换器的记录顺序相反,后者是由成员上的属性定义的JsonConverter,然后是由类上的属性定义的JsonConverter,最后是所有转换器传递给JsonSerializer。

    • [JsonExtensionDataAttribute]-对应于Newtonsoft的[JsonExtensionData]

    • [JsonIgnoreAttribute]-对应于Newtonsoft的[JsonIgnore]

  3. 通过编写JSON时Utf8JsonWriter,可以通过将设置JsonWriterOptions.Indentedtrue或来控制缩进false

    通过序列化为JSON时JsonSerializer.Serialize,可以通过设置JsonSerializerOptions.WriteIndentedtrue或来控制缩进false

这里的演示小提琴展示了使用进行序列化JsonSerializer和解析JsonDocument