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がありません