【C#】JSON配列をデシリアライズする方法とエラー対策

JSONデータの扱いは特に複雑な配列やネストされた構造を含む場合、
開発者にとって大きな挑戦となります。

本記事では、C#を用いてJSON配列をデシリアライズする方法について詳しく解説し、
よくあるエラーの解決策も提供します。
初心者から中級者まで、JSONデータを効果的に操作したい方にとって、
この記事は大きな助けになるでしょう。

記事のポイント

  • JSONデータをC#でデシリアライズする基本的な手順
  • 複雑な配列やネストされた構造のデシリアライズ
  • よくあるエラーの対処法とその解決策
目次

C#でJSON配列をデシリアライズする方法

JSON配列を読み込み、デシリアライズする基本手順

C#でJSON配列をデシリアライズするには、
主にSystem.Text.JsonまたはNewtonsoft.Jsonライブラリを使用します。
System.Text.JsonC#の標準ライブラリであり、軽量で効率的です。
例えば、System.Text.Jsonの場合は次のようにしてJSON配列をデシリアライズできます。

using System.Text.Json;

public class Sample
{
    public int Id { get; set; }
    public string Name { get; set; }
}

string jsonString = "[{\"Id\": 1, \"Name\": \"John\"}, {\"Id\": 2, \"Name\": \"Jane\"}]";
List<Sample> samples = JsonSerializer.Deserialize<List<Sample>>(jsonString);

このコードは、jsonStringに格納されたJSON配列をList<Sample>にデシリアライズしています。
JSONのキー名とC#クラスのプロパティ名は一致させる必要があり、
異なる場合はアノテーションを使ってマッピングできます。

Newtonsoft.Jsonの場合は次のようにしてJSON配列をデシリアライズできます。
NuGetパッケージからNewtonsoft.Jsonをインストールして使用します。

using Newtonsoft.Json;
using System;
using System.Collections.Generic;

public class Sample
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Program
{
    public static void Main()
    {
        string jsonString = "[{\"Id\": 1, \"Name\": \"John\"}, {\"Id\": 2, \"Name\": \"Jane\"}]";

        // Newtonsoft.Jsonを使ってデシリアライズ
        List<Sample> samples = JsonConvert.DeserializeObject<List<Sample>>(jsonString);

        foreach (var sample in samples)
        {
            Console.WriteLine($"ID: {sample.Id}, Name: {sample.Name}");
        }
    }
}

JSON多次元配列をデシリアライズする

多次元配列をデシリアライズする場合も、リストや配列を使って簡単に扱えます。

string jsonString = "[[1, 2], [3, 4]]";
int[][] multiDimArray = JsonSerializer.Deserialize<int[][]>(jsonString);

この例では、int[][]として二次元配列をデシリアライズしています。
多次元配列を扱う場合、
階層が深くなるにつれデシリアライズの複雑さが増すため、データ構造の理解が重要です。

JSONのネストされた構造をデシリアライズする

JSONデータが入れ子構造を持つ場合、C#のクラスも同様の構造を持つ必要があります。
例えば、System.Text.Jsonの場合次のようにデシリアライズできます。

public class Address
{
    public string City { get; set; }
    public string ZipCode { get; set; }
}

public class Person
{
    public string Name { get; set; }
    public Address Address { get; set; }
}

string jsonString = "{\"Name\": \"John\", \"Address\": {\"City\": \"Tokyo\", \"ZipCode\": \"123-4567\"}}";
Person person = JsonSerializer.Deserialize<Person>(jsonString);

このように、入れ子になった構造を正しくデシリアライズするには、関連するクラスを用意することがポイントです。

また、Newtonsoft.Jsonの場合は次のようにしてデシリアライズできます。

using Newtonsoft.Json;
using System;

public class Address
{
    public string City { get; set; }
    public string ZipCode { get; set; }
}

public class Person
{
    public string Name { get; set; }
    public Address Address { get; set; }
}

public class Program
{
    public static void Main()
    {
        string jsonString = "{\"Name\": \"John\", \"Address\": {\"City\": \"Tokyo\", \"ZipCode\": \"123-4567\"}}";

        // 入れ子構造のデシリアライズ
        Person person = JsonConvert.DeserializeObject<Person>(jsonString);

        Console.WriteLine($"Name: {person.Name}");
        Console.WriteLine($"City: {person.Address.City}, ZipCode: {person.Address.ZipCode}");
    }
}

JSONデシリアライズ時のエラー対策

JSONデシリアライズ時に発生するよくあるエラーとその解決法

JSONデシリアライズ時にエラーが発生することがあります。
最もよくあるエラーの一つは、
JSON形式が不正な場合や、C#クラスのプロパティとJSONのフィールド名が一致しない場合です。
このようなエラーに対処するために、JSONのフォーマットをしっかり確認し、
プロパティ名とフィールド名が一致しているか確認します。

public class Person
{
    public string FullName { get; set; }
    public int Age { get; set; }
}

string jsonString = "{\"Name\": \"John\", \"Age\": 30}"; // FullNameではなくNameが使われている
Person person = JsonSerializer.Deserialize<Person>(jsonString); // エラーが発生

このエラーを防ぐには、JSONプロパティをアノテーションで正しくマッピングします。

public class Person
{
    [JsonPropertyName("Name")]
    public string FullName { get; set; }
    public int Age { get; set; }
}

これにより、プロパティ名が異なっていても、正しくデシリアライズできます。

複数のJSON配列のデシリアライズ方法

複数のJSON配列を一度にデシリアライズすることもできます。
例えば、以下のようなデータを扱います。

string jsonString = "{\"people\": [{\"Name\": \"John\", \"Age\": 30}, {\"Name\": \"Jane\", \"Age\": 25}], \"addresses\": [{\"City\": \"Tokyo\", \"ZipCode\": \"123-4567\"}, {\"City\": \"Osaka\", \"ZipCode\": \"987-6543\"}]}";

var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
var result = JsonSerializer.Deserialize<Dictionary<string, object>>(jsonString, options);

このコードでは、Dictionary<string, object>を用いて、
複数のJSON配列をデシリアライズしています。

JSON配列を変換する際の注意点

C#でJSON配列を扱う際はデシリアライズの方法やエラー対策だけでなく、
配列の型や入れ子構造にも注意を払う必要があります。

多次元配列やネストされたオブジェクトをデシリアライズする場合、
データ構造が一致していないとエラーが発生する可能性が高まるため、
データの構造を事前にしっかり理解しておきましょう。

C#でJSON配列をデシリアライズする際の要点まとめ

本記事では、C#でのJSON配列のデシリアライズについて詳しく解説しました。
基本的な配列のデシリアライズから多次元配列や入れ子構造、複数の配列を同時に扱う方法まで、
さまざまな場面で役立つ情報を提供しました。
これにより、データ処理の精度と効率が向上するでしょう。

他にもC#の様々なテクニックの紹介やエンジニアに役立つ情報を発信していますので興味のある方は以下のリンクからどうぞ!

C#やエンジニアに役立つ情報はこちら

収入を上げたいエンジニアはこちら

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次