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

最佳答案

您在这里问几个问题:

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

    您可以使用 JsonDocument parse并检查以 RootElement 开头的任何JSON。根元素的类型为 JsonElement ,它表示任何JSON值(是否为原始值),并且对应于Newtonsoft的 JToken

    但是请注意此文档remark:



    当您需要在文档的生存期之外使用 JsonElement 时,必须使用clone:



    另请注意,JsonDocument当前为read-only,并且不提供用于创建或修改JSON的API。有一个公开问题Issue #39922: Writable 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);
    
  • 等效的JsonProperty属性又是什么?

    可以控制 JsonSerializer 的属性放在 System.Text.Json.Serialization 命名空间中,并从抽象基类 JsonAttribute 继承。与JsonProperty不同,没有omnibus属性可以控制属性序列化的所有方面。而是有特定的属性来控制特定的方面。

    从.NET Core 3开始,这些功能包括:
  • [JsonPropertyNameAttribute(string)] :



    这是您要用来控制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)] :



    请注意,documented priority of converters-属性上的Attribute,然后是选项中的Converters集合,然后是类型上的Attribute-与Newtonsoft converters的记录顺序不同, [JsonExtensionDataAttribute] 是成员上的attribute定义的JsonConverter,然后是由属性定义的JsonConverter在一个类上,最后所有转换器都传递给JsonSerializer。
  • [JsonExtensionData] -对应于Newtonsoft的 [JsonIgnoreAttribute]
  • [JsonIgnore] -对应于Newtonsoft的 Utf8JsonWriter
  • 通过 JsonWriterOptions.Indented 编写JSON时,可以通过将 true 设置为falseJsonSerializer.Serialize来控制缩进。

    通过 JsonSerializerOptions.WriteIndented 序列化为JSON时,可以通过将here设置为truefalse来控制缩进。

  • 演示 fiddle ojit_a展示了使用JsonSerializer进行序列化和使用JsonDocument进行解析。

    关于c# - 在.net core 3中将newtonsoft代码转换为System.Text.Json。等效于JObject.Parse和JsonProperty,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58271901/

    10-10 23:04