🎃

【Verse】JSONデータの入力と取得

に公開

前書き

VerseにはJSON文字列を解析・変換する以下の関数が存在します。
https://github.com/aiiroIndy/fortnite-verse-api/blob/54c3ef229a9851bc94f06f27b0ca21cc9566cf66/original/UnrealEngine/UnrealEngine.digest.verse#L44-L65
本記事では、VerseにおけるJSONの使い方について、入力方法と取得方法を書きます。

執筆環境

フォートナイトエコシステム v36.30 (UE5.6.0)

JSONを入力する

JSONは、 "キー" : 値 のようにキーと値をペアで書きます。
Verseの変数・定数にはパスカルケースを使うことが推奨されています[1]が、JSONでの命名規則は使用言語によって異なるようです。キャメルケースやスネークケースが使用されることが多いらしく、今回はキャメルケース・スネークケースにしました。(以下のキーはいずれも1単語なので、どちらも同じです。)

以下はJSONの例です。
VerseでJSONをstring型(文字列)で定義し[2]、UEFN上のVerseデバイスの値、もしくはVerse内でJSONを設定します。

{
    "name" : "Player1",
    "level" : 15,
    "score" : 1250.5,
    "items" : [
        "sword",
        "shield",
        "potion"
    ]
}

UEFNからJSONを設定する方法

Verseで@editableをつけたstring型フィールドを作成し、UEFNに公開します。
UEFNからVerseデバイスにJSONを入力します。

json_smaple_device := class(creative_device):

    # UEFNからJSONを設定する場合
    @editable
    JSONString:string = ""

JSONStringにJSONを貼り付ける

VerseからJSONを設定する方法

VerseでJSONを設定する場合、エスケープ処理が必要です。
ダブルクォーテーション(")と中括弧({, })の直前にはバックスラッシュ(\)をつけます。

json_smaple_device := class(creative_device):

    # 1行で書く場合
    JSONString_2:string =
        "\{\"name\":\"Player1\",\"level\":15,\"score\":1250.5,\"items\":[\"sword\",\"shield\",\"potion\"]\}"

    # 複数行で書く場合
    JSONString_3:string =
        "\{" +
            "\"name\" : \"Player1\"," +
            "\"level\" : 15," +
            "\"score\" : 1250.5," +
            "\"items\" : [" +
                "\"sword\"," +
                "\"shield\"," +
                "\"potion\"" +
            "]" +
        "\}"

JSONの値を取得する

JSONモジュールのVerseAPIの使用例

PrintJSONData(JSONString:string) : void =    
    if:
        # JSON文字列を解析し、value型で取得
        JSONValue:value = JSON.Parse[JSONString]
        # キーと値のペアを取得(map型)
        JSONObject:[string]value = JSONValue.AsObject[]

    then:
        # "name" の値をstring型で取得
        if (NameValue:value = JSONObject["name"], Name := NameValue.AsString[]):
            Print("プレイヤー名: {Name}")
        
        # "level" の値をint型で取得
        if (LevelValue:value = JSONObject["level"], Level := LevelValue.AsInt[]):
            Print("レベル: {Level}")
        
        # "score" の値をfloat型で取得
        if (ScoreValue:value = JSONObject["score"], Score := ScoreValue.AsFloat[]):
            Print("スコア: {Score}")
        
        # "items" の値を配列で取得し、配列の各要素をstring型で取得
        if (ItemsValue:value = JSONObject["items"], ItemsArray := ItemsValue.AsArray[]):
            Print("アイテム一覧:")
            for (ItemValue : ItemsArray):
                if (ItemName := ItemValue.AsString[]):
                    Print("- {ItemName}")



自作関数PrintJSONData の呼び出し

json_smaple_device := class(creative_device):

    JSONString_2:string =
        "\{\"name\":\"Player1\",\"level\":15,\"score\":1250.5,\"items\":[\"sword\",\"shield\",\"potion\"]\}"

    OnBegin<override>()<suspends>:void =
        PrintJSONData(JSONString_2)



実行結果

LogVerse: : プレイヤー名: Player1
LogVerse: : レベル: 15
LogVerse: : スコア: 1250.500000
LogVerse: : アイテム一覧:
LogVerse: : - sword
LogVerse: : - shield
LogVerse: : - potion
脚注
  1. Verseコードのスタイルガイド
    https://dev.epicgames.com/documentation/ja-jp/fortnite/verse-code-style-guide-in-unreal-editor-for-fortnite#2-3-pascal-case-everything-else ↩︎

  2. JSONファイルを操作する方法は現時点ではありません。 ↩︎

Discussion