LoginSignup
1
1

More than 1 year has passed since last update.

System.Text.Jsonでお行儀の悪いJsonを読み込む

Last updated at Posted at 2021-08-08

Stringとして定義されている項目に数字が引用符無しで入ってたり (Number扱いで死ぬ)
Arrayとして定義されているのに値が1つだけの場合にObjectで返ってきたり (当然型違いで死ぬ)
するJsonを読み込みたい、でもConverterこさえるのも面倒、ってな時に。

やってること自体は一度JsonElementで受けてプロパティ呼ぶ時に変換するだけという単純なもの。

読み込みたいJson
{
    "item1": "item"
}
{
    "item1": 100
}
Json定義
public class JsonData
{
    [JsonPropertyName("item1")]
    public JsonElement? Item1Value { get; set; }

    string item1; // 一度読んだ値は保持しておく
    [JsonIgnore]
    public string Item1
    {
        get
        {
            if (item1 != null) return item1;
            if (!Item1Value.HasValue) return null; // null値の場合はGet~すると死ぬのでここで返す
            // 任意の変換処理
            return item1 = Item1Value.Value.ValueKind switch
            {
                JsonValueKind.String => Item1Value.Value.GetString(),
                JsonValueKind.Number=> Item1Value.Value.GetInt32().ToString(),
                // object,arrayのコード例
                // JsonValueKind.Object => new[] {  JsonSerializer.Deserialize<HogeHoge>(ItemValue.Value.GetRawText()) },
                // JsonValueKind.Array => JsonSerializer.Deserialize<HogeHoge[]>(ItemValue.Value.GetRawText()),
                _ => throw new NotSupportedException()
            }
        }
    }
}

デシリアライズ
public void Deserialize()
{
    var text = (Json読み込み);
    var json = JsonSerializer.Deserialize<JsonData>(text);
}

とりあえずstringにしたいだけならNewtonsoft.Json使ってしまう方が早い気がする。

参照: JsonValueKind 列挙型

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1