.netコアでnewtonsoftコードをSystem.Text.Jsonに変換する3. 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; }
}

同等のものを探しているもう1つのことFormating.None


私が理解したのは、単純なレベルのjsonの場合、それは本当に簡単です。いくつかのネストされたjson、いくつかの時間形式、デフォルト値、ディクショナリ直接json作成などを使用しているものについては、変換の前後で結果を比較するために適切なユニットテストを行う必要があります
Kamran Shahid

回答:


15

ここでいくつかの質問をしています。

  1. に相当するものを見つけることができません JObject.Parse(json);

    を使用JsonDocumentして、任意のJSON を解析および検査できますRootElement。ルート要素は、JsonElementJSON値(プリミティブかどうか)を表すタイプで、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同等の属性は何ですか?

    制御できる属性JsonSerializerSystem.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、同じタイプのプロパティに別のコンバーターがない限り、指定されたコンバーターが使用されます。

      なお、コンバータの文書優先 - 、プロパティの属性、オプションで、次いでコンバータコレクション、型の属性 -のために文書化順序と異なるNewtonsoft変換され、JsonConverterがメンバーの属性によって定義され、次いでJsonConverterクラスの属性によって定義され、最後にJsonSerializerに渡されるすべてのコンバーター。

    • [JsonExtensionDataAttribute]-Newtonsoftのに対応し[JsonExtensionData]ます。

    • [JsonIgnoreAttribute]-Newtonsoftのに対応し[JsonIgnore]ます。

  3. を介してJSONを書き込む場合Utf8JsonWriter、インデントはまたはに設定JsonWriterOptions.Indentedすることで制御できます。truefalse

    経由JsonSerializer.SerializeでJSONにシリアル化する場合、インデントはまたはに設定JsonSerializerOptions.WriteIndentedすることで制御できます。truefalse

デモフィドルは、ここで直列化を示すJsonSerializerとして解析しますJsonDocument


@dbcに感謝します。JsonDocument.Parseは、JObjectではJsonで機能し、その他ではJsonPropertyNameで機能するようです。明日私のアプリケーションを変換してチェックします。私はFormating.None感謝の同等を探していますもう一つ
カムラン・シャヒード

@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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.