2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Utf8JsonのDeserialize

Posted at

はじめに

Unity(C#)でJsonを使用したくてUtf8Jsonを導入したのですが、
Utf8JsonのDeserializeでつまづいた箇所がありましたので記事にしてみました。
つまづいたのはちゃんと私が調べられてないだけですが

簡単な例

シンプルなJsonのDeserializeを実行してみます。
Unity上からなのでDebug.Logで出力しています。

エスケープ前のJson(コード上はエスケープしている状態のため)
{"type": "Apple", "size": "small"}

コード例

出力はUnityのDebug.Logを使用しています。
通常のC#ならDebug.LogをSystem.out.printlnに置き換えればいいかと思います。

// テストデータ
string json = "{\"type\": \"Apple\", \"size\": \"small\"}";

// Deserializeを実行
Dictionary<string, object> deserializeData = Utf8Json.JsonSerializer.Deserialize<dynamic>(json);
// Key,Valueのデータとして取り出す
foreach (KeyValuePair<string, object> pairData in deserializeData) {
    Debug.Log(string.Format("key={0} value={1}", pairData.Key, pairData.Value));
}

出力結果(余計な部分は排除)

いたって普通に取り出せました。

key=type value=Apple
key=size value=small

つまづいた例

シンプルなJsonですと使い勝手が悪いのでオブジェクトと配列を使いたかったのです。
ただ、配列の取り出し方がよくわからなかったのでつまづいてしまいました。

フォーマットしたJson
stock_dataというオブジェクトの中に配列を持っています。

{
    "stock_data": [
        {
            "type": "apple",
            "size": "small"
        },
        {
            "type": "pear",
            "size": "large"
        }
    ]
}

コード例

// テストデータ
string json = "{\"stock_data\":[{\"type\":\"apple\",\"size\":\"small\"},{\"type\":\"pear\",\"size\":\"large\"}]}";

// Deserializeを実行
var deserializeData = Utf8Json.JsonSerializer.Deserialize<dynamic>(json);

// stock_dataオブジェクトからデータを取り出す
List<object> stockData =  deserializeData["stock_data"];

// List<object>として格納されているので取り出す
foreach (object dictionaryData in stockData) {
    // objectをDictionary<string, object>に変換
    Dictionary<string, object> dictionary = dictionaryData as Dictionary<string, object>;

    // Key,Valueのデータとして取り出す
    foreach (KeyValuePair<string, object> pairData in dictionary) {
        Debug.Log(string.Format("key={0} value={1}", pairData.Key, pairData.Value));
    }
}

出力結果(余計な部分は排除)

無事に取り出す事ができました。
配列データはList<object>型で取り出すという事がポイントでした。

key=type value=apple
key=size value=small
key=type value=pear
key=size value=large

余談

調査している時にC#は型が文字列で取得できるという事で

Debug.Log(deserializeData["stock_data"].GetType().FullName);

というコードを追加したのですが、

System.Collections.Generic.List`1[[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]

という形で出力されてよくわかりませんでした。(今見ると丸わかりですが…)
習熟している人ならList<object>型で取り出すだろうという発想が出たと思いますが、
C#をたまにしか触らないのでずいぶん手間がかかってしまいました…

2
4
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
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?