2017-02-11 7 views
0

キーと値からなるネストされたJSONファイルが文字列のみで構成されています。しかし、JSONファイルの構造は固定されていないので、3レベル、時には2レベルしか入れられないことがあります。 厳密なモードでこれをどのようにシリアル化できるのだろうか?ハック厳密モードでJSONを逆シリアル化する

"live" : { 
"host" : "localhost", 
"somevalue" : "nothing", 
"anobject" : { 
    "one" : "two", 
    "three" : "four", 
    "five" : { 
    "six" : "seven" 
    } 
} 

}

私はJSONの構造を知っているだろう場合は、私は単にそれのために自分のクラスを記述しますが、キーは固定されていないため、また、ネスティングには、いくつかのレベルにすることができ、私は本当にどのように私は特定のタイプにそのようなオブジェクトを入れてカットするのだろうか。

すべてのヘルプやヒントは、私はinvariant sがここにもあなたを提供すると思います

答えて

0

を高く評価しました。まず第一に、あなたがハックに厳密にキー付きツリーを入力することができることを知っていると便利かもしれません:

<?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_structuresおよび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); 
    } 
} 

、あなたはまだKeyedTreecontainsKey不変条件を補足する必要があります、:主張する一切の興味深い固定構造がないので、全体のブロブが不明な極端な場合には、その後、あなたはTypeAssertを切り出すことができしかし、これはHackの非構造化データの現実です。

+0

入力いただきありがとうございます。 – Bearzi