記事
· 2025年1月6日 2m read

JSON文字からダイナミックオブジェクトを作成する際、エラー #5035: 一般例外 名前 'Premature end of data'エラーが出る

これは InterSystems FAQ サイトの記事です。

POST要求で受信したBodyのJSON文字列を、REST ディスパッチクラス内メソッドでダイナミックオブジェクト(%DyamicObject)に変換する際、以下エラーが発生する場合があります。

{
    "errors": [
        {
            "code": 5035,
            "domain": "%ObjectErrors",
            "error": "エラー #5035: 一般例外 名前 'Premature end of data' コード '12' データ ''",
            "id": "GeneralException",
            "params": [
                "Premature end of data",
                12,
                ""
            ]
        }
    ],
    "summary": "エラー #5035: 一般例外 名前 'Premature end of data' コード '12' データ ''"
}

POST要求時に送付するBodyの中身は、RESTディスパッチクラスの中では %request.Content を使用して操作でき、%request.Content.Read()とした場合、JSON文字列が取り出せます。

%request.Content.Read()の結果(=POST要求で受信したBodyの長さ)が32KBを超える場合に、上記エラーが発生します。

メモ:変数%requestは%CSP.Requestクラスのインスタンス

JSON文字からダイナミックオブジェクトに変換する際使用する%FromJSON()メソッドの引数には、JSON文字列かJSON文字列が含まれるストリームを指定することができます。

%FromJSON()の引数に32KBを超えるJSON文字列を渡した場合、上記エラーが発生してしまいますので、以下の例のようにJSON文字を引数に指定するのではなく

set bodyjson={}.%FromJSON(%request.Content.Read())

JSON文字を含むストリームを%FromJSON()に渡す以下例の方法を使用することでエラーを回避できます。

set bodyjson={}.%FromJSON(%request.Content)
ディスカッション (0)1
続けるにはログインするか新規登録を行ってください