2016-11-16 13 views
3

JSONオブジェクトを表す文字列があるとします。別のシステム(たとえば、%param%)に置き換えられるパラメータがある可能性があるため、は無効です。 regexを使用して、 "true"と等しい既知のpropertyNameを持つすべてのオブジェクトを削除する必要があります。上記の例では正規表現を使用してJSONから特定のプロパティを持つオブジェクトを削除します

{ 
    "someTopLevelProp": "value", 
    "arrayOfData": [ 
     { 
      "firstPropIAlwaysKnow": "value", 
      "dontCareProp": $paramValue$, 
      "dontCareProp2": 2, 
      "flagWhichShouldIUse": true, 
      "somethingAtTheEnd": "value" 
     }, 
     { 
      "absolutelyAnotherObject": %paramValue% 
     }, 
     { 
      "firstPropIAlwaysKnow": "value", 
      "dontCareProp": "value", 
      "dontCareProp2": 2, 
      "flagWhichShouldIUse": false, 
      "somethingAtTheEnd": "value" 
     }, 
     { 
      "firstPropIAlwaysKnow": "value", 
      "dontCareProp": "value", 
      "dontCareProp2": 2, 
      "flagWhichShouldIUse": true, 
      "somethingAtTheEnd": "value" 
     } 
    ] 
} 

、私は常にオブジェクトが私は必要なフラグを含めることができることを意味し、「firstPropIAlwaysKnow」を持っています。その後、他のプロパティが存在する可能性があります。しかし、ここで最も重要なのは "flagWhichShouldIUsing"です。これは、このオブジェクトを削除する必要があることを意味します(値が 'true'の場合のみ)。結果として私は受け取る必要があります:

{ 
    "someTopLevelProp": "value", 
    "arrayOfData": [ 
     { 
      "absolutelyAnotherObject": %paramValue% 
     }, 
     { 
      "firstPropIAlwaysKnow": "value", 
      "dontCareProp": "value", 
      "dontCareProp2": 2, 
      "flagWhichShouldIUse": false, 
      "somethingAtTheEnd": "value" 
     } 
    ] 
} 

私の正規表現の知識は十分ではないので、親切にコミュニティの助けを求めてください。

P.S. JSONを正規表現で解析することについては言及しないでください。狂ったり、間違ったりすることはありません。

ANSWER:私はそのようなことをする正規表現を作っています。ここでお手伝いしようとしてくれた皆さん、ありがとうたぶんそれは誰かにとって役に立ちます。

/{\s+?"firstPropIAlwaysKnow": "value"[^{}]+?(?:\{[^}]*\}[^}]+?)*[^}]+?"flagWhichShouldIUse": true[^}]+?},?/gi 

Regexper

+0

これは実際にはJSONパーサーそれは 'JSON.parse'をスローさせる特定の構文を認識しています。最大の問題は入れ子です。 –

+0

おそらく無効な部分は明確に定義されていますか?たとえば、何らかの無効なものが、あるプロパティの値としてjson内の '%...%'式から来ていることが分かっているとします。 –

答えて

3

あなたは本当にただの正規表現でこれを行うことはできません。このような何かがうまくいくかもしれない:

let filtered = jsonstring 
    // split into the individual 'objects' 
    // might need to modify this depending on formatting. You 
    // could use something like /},\s*{/ to split the string, 
    // but couldn't re-join with same formatting 
    .split('},{') 
    // filter for only the strings with the relevant property 
    // set to false 
    .filter(s => s.match(/"flagWhichShouldIUse":\s*false/) // again, may need to change 
    // put humpty-dumpty back together again 
    .join('},{'); 

を正確な分割方法は、あなたのJSONの構造に大きく依存し、これはばかプルーフされていません。それは適切にネスティングを処理しません。あなたのJSONがきれいに印刷されている場合、タブ/スペース文字の数をスプリッタの一部として使うことができます:例えば、1つのタブのみに分割します:/\n\t},\s*{/

+0

非常に興味深い考えで、おそらくより安定しています。 –

+0

@ kirill.bugaはい、カスタムjsonパーサ文法を書くよりも少ない仕事です:) –

+0

私はまた、オブジェクトの先頭にカンマをつけています。 –

関連する問題