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

时间:2019-10-07 14:42:18

标签: 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;
    }
}

我找不到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

2 个答案:

答案 0 :(得分:7)

您在这里问几个问题:

  1. 我找不到import React, { Component } from 'react' import { Provider } from 'react-redux' import { PersistGate } from 'redux-persist/integration/react' import configureStore from './Stores/CreateStore' import RootScreen from './Containers/Root/RootScreen' import SplashScreen from "App/Containers/SplashScreen/SplashScreen"; const persistantStore = configureStore(); const { store, persistor } = persistantStore; const _XHR = GLOBAL.XMLHttpRequest = GLOBAL.originalXMLHttpRequest || GLOBAL.XMLHttpRequest; XMLHttpRequest = _XHR export default class App extends Component { render() { console.disableYellowBox = true; return ( <Provider store={store}> <PersistGate loading={null} persistor={persistor}> <RootScreen /> </PersistGate> </Provider> ) } }

    的任何等效项

    您可以使用JsonDocumentparse并检查任何JSON。但是请注意此文档remark

      

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

    还要注意,该类型当前为read-only,并且不提供用于创建或修改JSON的API。当前有一个未解决的问题 Issue #39922: Writable Json DOM 对此进行跟踪。

    使用示例如下:

    JObject.Parse(json);
  2. 等效的属性//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); 是什么?

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

    从.NET Core 3开始,这些功能包括:

    • [JsonPropertyNameAttribute(string)]

        

      指定序列化和反序列化时JSON中存在的属性名称。这将覆盖JsonNamingPolicy指定的任何命名策略。

      这是您要用来控制JsonProperty类的序列化名称的属性:

      ResponseJson
    • [JsonConverterAttribute(Type)]

        

      放置在类型上时,将使用指定的转换器,除非将兼容的转换器添加到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; } } 集合中,或者同一类型的属性上有另一个JsonSerializerOptions.Converters

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

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

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

  3. 通过Utf8JsonWriter编写JSON时,可以通过将JsonWriterOptions.Indented设置为JsonConverterAttributetrue来控制缩进。

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

演示小提琴here显示使用false进行序列化并使用JsonSerializer进行解析。

答案 1 :(得分:1)

此链接应该可以助您一臂之力,下面是我在其中复制的摘要。

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