0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UWSCRAdvent Calendar 2023

Day 11

UWSCRの新要素:UObject

Last updated at Posted at 2023-12-10

UObjectはjson互換のオブジェクトです。専用の組み込み関数によりjsonとUObjectの相互変換が可能です。また、jsonのリテラル表記からUObjectを得ることも可能です。

UObjectの作成

jsonからUObjectを得る方法は以下の二通りあります。

リテラル表記

@@の中にjsonを書くことでUObjectに変換されます。

obj = @{
    "foo": 123,
    "bar": {
        "qux": 345
    },
    "baz": [1, 2, 3]
}@

print obj // {"bar":{"qux":345},"baz":[1,2,3],"foo":123}

@@の内部は文字列として扱われるため、UWSCRの変数は利用できません。

hoge = 123

// 変数hogeをリテラル表記で使うことはできない
// jsonパーサによりエラーになります
obj = @{
    "foo": hoge
}@

このような場合は変数展開表記を使ってください。

hoge = 123
fuga = "ふがふが"

// json文字列は展開可能文字列であるため、<#変数名>表記が利用可能
obj = @{
    "foo": <#hoge>,
    "bar": "<#fuga>"
}@

print obj // {"bar":"ふがふが","foo":123}

FromJson関数

json文字列をUObjectに変換します。パースに失敗した場合はEMPTYが返ります。

json = fget(fopen("C:\uwscr\hoge.json", F_READ), F_ALLTEXT)
obj = fromjson(json)
if obj != EMPTY then
    print obj
endif

UObjectをjsonにする

ToJson関数を使ってUObjectをjson文字列に変換します。

obj = @{
    "foo": 123,
    "bar": {
        "qux": 345
    },
    "baz": [1, 2, 3]
}@

print tojson(obj) // {"bar":{"qux":345},"baz":[1,2,3],"foo":123}

// 第二引数TRUEで整形する
print tojson(obj, TRUE)
// {
//   "bar": {
//     "qux": 345
//   },
//   "baz": [
//     1,
//     2,
//     3
//   ],
//   "foo": 123
// }

UObjectの使い方

UObjectの持つ値へは.表記やインデックス表記でアクセスできます。

obj = @{
    "foo": 123,
    "bar": {
        "qux": 345
    },
    "baz": [1, 2, 3]
}@

// .で呼ぶ
print obj.foo     // 123
// インデックスでも良い
print obj["foo"]  // 123
// ネストの場合.で繋いでいく
print obj.bar.qux // 345
// 配列
print obj.baz     // [1, 2, 3]
// 配列のインデックス
print obj.baz[0]  // 1

try
    // 存在しないメンバを呼ぶとエラーになる
    print obj.quux
except
    print TRY_ERRMSG // [UObjectエラー] メンバが存在しない、または不正なインデックス: quux
endtry

// 代入もできる
obj.foo = 456
print obj.foo // 456

ユーザー定義関数の引数型チェックにおけるUObject

ユーザー定義関数の引数の型としてUObjectを指定することが可能です。ただし、UObjectであることしか検査しないためオブジェクトの構成が正しいかどうかは関数内で精査する必要がある点には注意してください。

obj = @{
    "foo": 123
}@

function MyFunc(value: uobject)
    try
        result = value.foo
    except
        // UObjectにfooが存在しない場合はエラーにする
        raise("オブジェクトにfooがありません", "MyFunc引数エラー")
    endtry
fend

print MyFunc(obj) // 123
print MyFunc(@{"hoge": 1}@) // [MyFunc引数エラー] オブジェクトにfooがありません
0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?