2013-07-28 23 views
12

私は以下のJSON構造を持っていますが、それをさらに単純化する方法があるのだろうかと思っています。何らかの形ですべてのエントリから「成分」と「量」を削除して減らすことができますか?JSON構造の簡略化

var cooking = { 
      "recipes" : [ 
       { 
        "name":"pizza", 
        "ingredients" : [ 
         { 
          "ingredient" : "cheese", 
          "quantity" : "100g" 
         }, 
         { 
          "ingredient" : "tomato", 
          "quantity" : "200g" 
         } 
        ] 
       }, 
       { 
        "name":"pizza 2", 
        "ingredients" : [ 
         { 
          "ingredient" : "ham", 
          "quantity" : "300g" 
         }, 
         { 
          "ingredient" : "pineapple", 
          "quantity" : "300g" 
         } 
        ] 
       } 
      ] 
     }; 
+3

があります場合は、...のデータが十分に速く転送されていない場合を除き、今あなたがデータ構造がdownvoteについてやや混乱し、正しい意思 – aaronman

答えて

14

はい、あなたはかなりのことを簡素化することができます:{"recipes": <...>}:あなたの例のトップレベルが単一項目のオブジェクトである

  • var recipes = { 
        "pizza": { 
         "cheese": "100g", 
         "tomato": "200g" 
        }, 
        "pizza 2": { 
         "ham": "300g", 
         "pineapple": "300g" 
        } 
    } 
    

    説明。これが実際に他のアイテムを持つオブジェクトの単純化されたバージョンでない限り、それは冗長です。あなたのコードは送信/受信の内容を知っているので、余分な情報はありません。

  • オブジェクトの値は、"name""ingredients"という2つのアイテムのオブジェクトの配列です。このような配列を持つたびに、それをオブジェクトに置き換える方が意味があります(よりコンパクトです)。親指のルールとして:

    オブジェクトの配列のキーが"key""value"に置き換えると、まだ意味をなすことができる場合は、単一オブジェクトと配列を置き換えます。

  • 同じルールがあなたの[{"ingredient": <...>, "quantity": <...>}, ...]配列に適用されます。各オブジェクトは、キーと値のペアに置き換えるとセンスを作り続けることができます。 65%削減 -

最終結果は、情報のこの表現は、元の249個の文字に比べ、(余分な空白を除去した)長さは87個の文字であることです。

+0

を表示することがより心配する必要があり、それを減らすことを心配すべきではありませんこの表現の問題は、私はそれを見ません。 –

+0

票を落とさなかったが、「レシピ」の部分を取り除いたからだと言うだろう。 – aaronman

+0

@aaronmanうーん、多分。 OPの例では、それは完全に冗長です。 –

3

間違いなく。一つの方法は、次のようになります。

var cooking = { 
     "recipes" : [ 
      { 
       "name":"pizza", 
       "ingredients" : [ 
        "cheese", 
        "tomato" 
        ], 
        "quantities" : [ // Have to be in order of ingredients 
         "100g", 
         "200g" 
       ] 
      } 
     ] 
    } 

それとも

var cooking = { 
    "recipes" : [ 
     { 
      "name":"pizza", 
      "ingredients" : [ // Putting ingredient and quantity together 
       "cheese:100g", 
       "tomato:200g" 
       ] 
     } 
    ] 
} 

彼らはあなたが名前を削除することができ、すべてのピザですので。

var cooking = { 
    "recipes" : [ 
     { 
      "ingredients" : [ 
       "cheese:100g", 
       "tomato:200g" 
       ] 
     }, 
     { 
      "ingredients" : [ 
       "ham:100g", 
       "pineapple:200g" 
       ] 
     } 
    ] 
} 
+4

配列の順序付けに頼っているのは、成分と量を関連付ける最良の方法です。 – brianestey

+0

@brianestey最高のソリューションではないかもしれませんが、OPはそれほど冗長ではない別のソリューションを求めていました。最初の解決策は、実際に価値の側面にある名前として "チーズ"、 "トマト"などを使用します。 – fastcodejava

+0

この場合、 ''チーズ ''と ''トマト ''がキーにならない理由を説明するのに気をつけますか?彼らは明らかに同じレシピで2回も起こることはなく、明らかに常にストリングになるでしょう。 –

0

希望すると、これは簡単です。 Jsonは、コンピュータと人間の両方に対して最小限で理解可能な方法で書かれなければなりません。

var cooking = { 
      "recipes" : 
      [   
      { 
       "name":"pizza", 
       "cheese": "100g" 
       "tomato": "200g" 
      }   
      , 
      { 
       "name":"pizza 2", 
       "ham": "300g" 
       "pineapple": "300g" 
      } 
      ] 
      } 
    };