を高く評価しました。まず第一に、あなたがハックに厳密にキー付きツリーを入力することができることを知っていると便利かもしれません:
<?hh // strict
class KeyedTree<+Tk as arraykey, +T> {
public function __construct(
private Map<Tk, KeyedTree<Tk, T>> $descendants = Map{},
private ?T $v = null
) {}
}
私はまだそれを試していない
、(cyclic shape definitions are sadly not allowedので、それはクラスでなければなりません) type_structure
sおよびFred Emmott's TypeAssert
もまた興味深い見込みです。 JSON BLOBの一部が修正されていることがわかっている場合、ネストされた不確実な部分を分離し、invariant
でツリーを構築することができます。道路下
use FredEmmott\TypeAssert\TypeAssert;
class JSONParser {
const type Blob = shape(
'live' => shape(
'host' => string, // fixed
'somevalue' => string, // fixed
'anobject' => KeyedTree<arraykey, mixed> // nested and uncertain
)
);
public static function parse_json(string $json_str): this::Blob {
$json = json_decode($json_str, true);
invariant(!array_key_exists('anobject', $json), 'JSON is not properly formatted.');
$json['anobject'] = self::DFS($json['anobject']);
// replace the uncertain array with a `KeyedTree`
return TypeAssert::matchesTypeStructure(
type_structure(self::class, 'Blob'),
$json
);
return $json;
}
public static function DFS(array<arraykey, mixed> $tree): KeyedTree<arraykey, mixed> {
$descendants = Map{};
foreach($tree as $k => $v) {
if(is_array($v))
$descendants[$k] = self::DFS($v);
else
$descendants[$k] = new KeyedTree(Map{}, $v); // leaf node
}
return new KeyedTree($descendants);
}
}
、あなたはまだKeyedTree
にcontainsKey
不変条件を補足する必要があります、:主張する一切の興味深い固定構造がないので、全体のブロブが不明な極端な場合には、その後、あなたはTypeAssert
を切り出すことができしかし、これはHackの非構造化データの現実です。
入力いただきありがとうございます。 – Bearzi