2017-02-10 4 views
0

Я новичок в заводной, и я хочу, чтобы построить объект JSON с застройщикомПостроить JSON строитель с arrayJson в заводной

{ 
    "query": { 
     "bool": { 
      "must": [ 
       { 
        "bool": { 
         "should": [ 
          { "match": { "content": "scontent" } }, 
          { "match": { "title":"stitle" } } 
         ] 
        } 
       }, 
       { 
        "bool": { 
         "should": [ 
          { "match": { "a1": "v1" } }, 
          { "match": { "a2":"v2" } }, 
          ... and so on ... 
          { "match": { "an":"vn" } } 
         ] 
        } 
       } 
      ] 
     } 
    }, 
    "highlight": { 
     "fields": { 
      "content":{} 
     } 
    } 
} 

Я ищу много других постов на StackOverflow и я пишу этот код Так Я сделал это, но не смог получить то, что хочу:

JsonBuilder builder = new JsonBuilder() 
def body = builder { 
    from Lib.or(qQuery.start, 0) 
    size Lib.or(qQuery.num, 10) 
    query { 
     bool { 
      must [ 
        { 
         bool { 
          should [ 
            { match { content 'scontent' } }, 
            { match { title 'stitle' } } 
          ] 
         } 
        }, 
        { 
         bool { 
          should myVals.collect {[ 
            'match' : { it.key it.value } 

          ]} 
         } 
        } 
      ] 
     } 
    } 
    highlight { 
     fields { 
      content {} 
     } 
    } 
} 

Спасибо за любую помощь!

ответ

3

Я думаю, вы можете сделать эту работу с JsonBuilder как есть, но, как правило, проще создать структуру данных, используя карты и списки (это то, что выдает строитель) в groovy, поскольку у вас там больше контроля.

Пример кода:

import groovy.json.* 

def data = [ 
    query: [ 
    bool: [ 
     must: [ 
     [bool: 
      [should: [ 
      [match: [ content: 'scontent']], 
      [match: [ title: 'stitle']] 
      ]] 
     ], 
     [bool: 
      [should: [ 
      [match: [ a1: 'v1']], 
      [match: [ a2: 'v2']], 
      [match: [ vn: 'vn']] 
      ]] 
     ] 
     ] 
    ] 
    ] 
] 

println JsonOutput.prettyPrint(JsonOutput.toJson(data)) 

производит:

{ 
    "query": { 
     "bool": { 
      "must": [ 
       { 
        "bool": { 
         "should": [ 
          { 
           "match": { 
            "content": "scontent" 
           } 
          }, 
          { 
           "match": { 
            "title": "stitle" 
           } 
          } 
         ] 
        } 
       }, 
       { 
        "bool": { 
         "should": [ 
          { 
           "match": { 
            "a1": "v1" 
           } 
          }, 
          { 
           "match": { 
            "a2": "v2" 
           } 
          }, 
          { 
           "match": { 
            "vn": "vn" 
           } 
          } 
         ] 
        } 
       } 
      ] 
     } 
    } 
} 

я не включил свой полный JSON, как это занимает некоторое пространство, но структура есть. Обратите внимание на использование списков ([valueA, valueB]) и карт ([someKey: someValue]) в структуре данных.

Предоставлено это делает JsonBuilder менее 100% полезным, но я не видел каких-либо сжатых способов включения списков больших объектов json в список внутри структуры. Вы можете сделать:

def json = JsonBuilder() 

json.query { 
    bool('list', 'of', 'values') 
} 

, но для больших структур как элементы списка, я бы сказал, перейдите со списками и подходами к карте.

+0

спасибо за ваш ответ/почему этот def json = новый JsonBuilder() определен? –

+0

, если вы имеете в виду первый блок кода, это было ошибкой. Исправлено. –

+0

Хорошо спасибо за вас :) –

Смежные вопросы