22

我正在将我的 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.

4

2 回答 2

26

你在这里问几个问题:

  1. 我找不到任何等价物JObject.Parse(json);

    您可以使用它JsonDocument解析和检查任何 JSON,从RootElement. 根元素的类型JsonElement代表任何 JSON 值(原始或非原始),并且对应于 Newtonsoft 的JToken.

    但请注意此文档备注

    此类利用池内存中的资源来最大程度地减少垃圾收集器 (GC) 在高使用情况下的影响。未能正确处置此对象将导致内存未返回到池中,这将增加对框架各个部分的 GC 影响。

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

    获取JsonElement可以在原始 的生命周期之后安全存储的JsonDocument

    另请注意,JsonDocument它目前是只读的,不提供用于创建或修改 JSON 的 API。有一个未解决的问题Issue #39922: Writable Json DOM tracking this。

    使用示例如下:

    //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的是,没有综合属性可以控制属性序列化的所有方面。相反,有特定的属性来控制特定的方面。

    从 .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

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

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

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

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

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

此处的演示小提琴显示了使用 的序列化JsonSerializer和解析JsonDocument

于 2019-10-07T16:49:34.040 回答
3

这个链接应该能让你继续前进,我在下面复制了其中的片段。

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; }

于 2019-10-07T16:36:27.037 回答