我正在将我的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
设置为false
或JsonSerializer.Serialize
来控制缩进。通过
JsonSerializerOptions.WriteIndented
序列化为JSON时,可以通过将here设置为true
或false
来控制缩进。 演示 fiddle ojit_a展示了使用
JsonSerializer
进行序列化和使用JsonDocument
进行解析。关于c# - 在.net core 3中将newtonsoft代码转换为System.Text.Json。等效于JObject.Parse和JsonProperty,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58271901/