2016-05-20 2 views
0

Я пытаюсь сделать JSON документ так:Получение ключ в последовательности/порядке JSONObject JAVA

{ 
"query": { 
    "bool":{ 
    "must":{ 
     "match": { 
      "action": "HI" 
     }, 
     "filter":{ 
     "range":{ 
      "epoch": { 
       "gte" : "1454964688008" 
      } 
     } 
     } 
    } 
    } 
} 

}

Условием является то, что матч должен быть всегда перед фильтром JSONObject.

SO, видя из this thread, я осуществил что-то вроде этого:

public static String getQuery(Alert reqAlert) { 


LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, Serializable>>>>> main = new LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, Serializable>>>>>(); 
     LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, Serializable>>>> query = new LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, Serializable>>>>(); 
     LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, Serializable>>> bool = new LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, Serializable>>>(); 
     LinkedHashMap<String, LinkedHashMap<String, Serializable>> must = new LinkedHashMap<String, LinkedHashMap<String, Serializable>>(); 
     LinkedHashMap<String, Serializable> match = new LinkedHashMap<String, Serializable>(); 
     LinkedHashMap<String, Serializable> filter = new LinkedHashMap<String, Serializable>(); 
     LinkedHashMap<String, LinkedHashMap<String, String>> range = new LinkedHashMap<String, LinkedHashMap<String, String>>(); 
     LinkedHashMap<String, String> epoch = new LinkedHashMap<String, String>(); 
     epoch.put("gte", "1454964688008"); 
     range.put("epoch", epoch); 
     filter.put("range", range); 
     match.put("action", reqAlert.getQueryString()); 
     must.put("match", match); 
     must.put("filter", filter); 
     bool.put("must", must); 
     query.put("bool", bool); 
     main.put("query", query); 


     JSONObject mainObject = new JSONObject(main); 

     return mainObject.toString(); 
     } 

Но всегда печати

{"query":{"bool":{"must":{"filter":{"range":{"epoch":{"gte":"1454964688008"}}}},"match":{"action":"HI"}}}} 

Что я должен делать?

+1

Конструктор 'JSONObject', который вы использовали' JSONObject (Map map) ', изменит ваши карты на' HashMap', поэтому порядок не будет хранителем. – Titus

+0

Здесь вы можете найти ответы: http://stackoverflow.com/questions/4515676/keep-the-order-of-the-json-keys-during-json-conversion-to-csv. Но как [верхний ответ] (http://stackoverflow.com/a/4515863/1970544) sugests, вы не должны полагаться на порядок полей. –

+0

Извините, я не видел, что вы связали тот же вопрос. Самый простой способ заставить его работать описан в [втором ответе] (http://stackoverflow.com/a/7981662/1970544): вы должны изменить источник 'JSONObject.java'. –

ответ

0

Так что, если у кого-то тоже есть такое же требование, лучший способ сделать это с помощью JSONObject из следующей зависимости maven.

 <dependency> 
      <groupId>org.codehaus.jettison</groupId> 
      <artifactId>jettison</artifactId> 
      <version>1.3.5</version> 
     </dependency> 

Jettison использует LinkedHashMap внутренне.