HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
0825
Velgail(失敗作) HSP3JSON(read)ライブラリを作成してみた4解決


Velgail

リンク

2021/8/25(Wed) 19:55:53|NO.93685

失敗作です。
何がというと…… たかだか数百KBのJSONを読むだけで応答なしで固まるからです。
(modinit関係の関数内ではwait 0もかけないのでDoEventsができない……(やり方があれば導入はしますがクソ遅いのには変わりなし)

https://gist.github.com/Velgail-HSP/deaccc78df0bc82cb49a6a2ef3cf6549#file-hsp3jsonread-as

このライブラリの目的はhspinet内のJSONを扱うライブラリがエゲツないゴミなので、double型もしっかり読み取れるJSONパーサーを自作して対応しようとしたものです。

失敗作確定した時点で拡張する気0になったので配列周りをforeach出来ないゴミですが、一応使い方を説明すると、


newmod js,hspjson,json // ここでjson変数にJSON文字列が入っている状態で mes getValue(js,".hoge.[2].fuga") // といった形で指定されたキーのデータを取れます
なのでjson変数の中身が

{ "hoge":[ 0,1,{"fuga":"piyo"},"pi",false], "foo":2.3e4; "bar":null }
だった場合、getValueの結果は"piyo"となります。(多分。やる気の無さが半端ない)

mod変数が相互参照出来ないとか、mod変数を1個作るのにかかる時間が多分長すぎてHSPが固まるとか仕様がホント……

(現在C++DLL版を作ってやろうと頑張ってます)



この記事に返信する


へび

リンク

2021/8/25(Wed) 20:52:15|NO.93686

> hspinet内のJSONを扱うライブラリがエゲツないゴミ
このスレッドは産業廃棄物の宣伝ですか?



Velgail

リンク

2021/8/25(Wed) 21:01:25|NO.93687

検証結果と「小規模なら一応使える」ライブラリの宣伝。

> hspinet内のJSONを扱うライブラリがエゲツないゴミ
doubleの値を扱うことが出来ないのは純然たる事実だから普通にゴミです。

だからユーザーが対策してみようとして「この方法だと大規模ファイルで死ぬ」ことを示したというわけですね。

「変に突っかかるなら作ってから物申せ」



usagi

リンク

2021/8/26(Thu) 03:18:29|NO.93690

もう解決したスレですが、hspinetを拡張すると良いと思います。

よくよく考えると実数の扱いってむつかしいですよね。。。
非数とか考慮すると文字列として扱った方が汎用性はありそうです。
(jsonの実数フォーマットって何かルール決まってましたっけ?)


#include "hspinet.as" #module Extention_hspinet #deffunc jsongetd var aVar, str aName, var aPtr jsongetobj@ p, aName, aPtr jsonout@ sValue, p aVar = Double(sValue) return #global data = {" { \"e\": 0.123e-3, \"pi\": 3.14 } "} jsonopen pjson, data jsongetd value1, "e", pjson jsongetd value2, "pi", pjson jsonclose mes value1 mes value2



usagi

リンク

2021/8/26(Thu) 04:49:16|NO.93691

getValueのhspinet版の貼り忘れ

#include "hspinet.as" #module Extention_hspinet #deffunc jsongetd var aVar, str aName, var aPtr jsongetobj@ p, aName, aPtr jsonout@ sValue, p aVar = Double(sValue) return #defcfunc getValue var aPjs, str aKey p = aPjs : buf = aKey : result = "" : sdim tokens split buf, ".", tokens foreach tokens : token = tokens.cnt if token = "" : continue if strmid(token, 0, 1) = "[" { subscript = Int( strmid(token, 1, strlen(token)-2) ) jsonnext@ p, p, 2 repeat subscript jsonnext@ p, p, 0 loop } else { jsongetobj@ p, token, p } loop jsonout@ result, p return result #global /////////////////////////// mes "★大きいデータの場合(割と早そうな雰囲気)" sdim data, 100000 data = "{\n" repeat 10000,1 // 数百Kのデータを作る data += "\"value"+cnt+"\": "+(0.123+cnt) if cnt != 10000 : data += ",\n" if cnt\100 = 0 : title "jsonデータ作成中:"+cnt loop data += "}" mes "データ作成完了:探索開始" jsonopen pjson, data jsongetd value, "value10000", pjson jsonclose mes value /////////////////////////// mes "★キーを階層で指定する場合" data = {" { \"hoge\":[0,1,{\"fuga\":\"piyo\"},\"pi\",false], \"foo\":2.3e4, \"bar\":null } "} jsonopen js, data mes getValue(js, ".hoge.[0]") mes getValue(js, ".hoge.[1]") mes getValue(js, ".hoge.[2].fuga") mes getValue(js, ".hoge.[3]") mes getValue(js, ".hoge.[4]") mes getValue(js, ".foo") mes getValue(js, ".bar") jsonclose



ONION software Copyright 1997-2023(c) All rights reserved.