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


12

我正在将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;
    }
}

我找不到任何等效的 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

Answers:


15

您在这里问几个问题:

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

    您可以使用JsonDocument分析和检查任何JSON,从它RootElement。根元素的类型JsonElement代表任何JSON值(是否为原始值),并对应于Newtonsoft的JToken

    但是千万要注意这个文件的备注

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

    当需要在JsonElement其文档的生存期之外使用外部文档时,必须克隆它:

    获取一个JsonElement可以安全存储超过原始生存期的JsonDocument

    另请注意,该JsonDocument属性当前是只读的,并且不提供用于创建或修改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);
    
    //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.Serialization命名空间中,并从抽象基类继承JsonAttribute。与不同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; }
      }
    • [JsonConverterAttribute(Type)]

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

      请注意,转换器记录优先级 - 属性为Attribute,然后是选项中的Converters集合,然后为类型为Attribute-与记录在案的Newtonsoft converters顺序不同,后者是由成员上的attribute定义的JsonConverter,然后是JsonConverter由类的属性定义,最后将所有传递给JsonSerializer的转换器定义。

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

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

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

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

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


谢谢@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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.