Построение упорядоченной строки JSON из LinkedHashMap
мне нужно было иметь пары ключ / значение в порядке моей вставки, поэтому я решил использовать LinkedHashMap
над HashMap
. Но мне нужно преобразовать LinkedHashMap
в строку JSON, где порядок в LinkedHashMap
сохраняется в строке.
но в настоящее время я достигаю это:
- первое преобразование LinkedHashMap в JSON.
-
затем преобразование JSON в строку.
import java.util.LinkedHashMap; import java.util.Map; import org.json.JSONObject; public class cdf { public static void main(String[] args) { Map<String,String > myLinkedHashMap = new LinkedHashMap<String, String>(); myLinkedHashMap.put("1","first"); myLinkedHashMap.put("2","second"); myLinkedHashMap.put("3","third"); JSONObject json = new JSONObject(myLinkedHashMap); System.out.println(json.toString()); } }
выход есть:
{"3":"third","2":"second","1":"first"} .
но я хочу, чтобы это было в порядке вставки ключей, например:
{"1":"first","2":"second","3":"third"}
как только я конвертирую LinkedHashMap
в JSON он теряет порядок (очевидно, что JSON не имеет понятия порядка), и, следовательно, строка тоже не в порядке. Теперь, как создать строку JSON, порядок которой совпадает с LinkedHashMap
?
5 ответов
Gson если ваш друг. Это выведет упорядоченную карту в упорядоченную строку JSON.
я использовал последнюю версию Gson (2.3.1), вы можете скачать ее через следующие параметры в нижней части этого сообщения.
import java.util.LinkedHashMap;
import java.util.Map;
import com.google.gson.Gson;
public class OrderedJson {
public static void main(String[] args) {
// Create a new ordered map.
Map<String,String> myLinkedHashMap = new LinkedHashMap<String, String>();
// Add items, in-order, to the map.
myLinkedHashMap.put("1", "first");
myLinkedHashMap.put("2", "second");
myLinkedHashMap.put("3", "third");
// Instantiate a new Gson instance.
Gson gson = new Gson();
// Convert the ordered map into an ordered string.
String json = gson.toJson(myLinkedHashMap, LinkedHashMap.class);
// Print ordered string.
System.out.println(json); // {"1":"first","2":"second","3":"third"}
}
}
Параметры Зависимостей
Maven
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3.1</version>
</dependency>
ш
compile 'com.google.code.gson:gson:2.3.1'
или Maven Central для дополнительной загрузки опции.
JSONObject
подразумевает использование org.json
библиотека. Не делайте этого; это старый прототип, и есть лучшие варианты, такие как Джексон и GSON.
С Джексоном вы бы просто использовать:
String json = new ObjectMapper().writeValueAsString(myLinkedHashMap);
и получите строку JSON с записями в любом порядке обхода, который использует ваша карта.
JSON не принимает порядок вставки из-за LinkedHashMap params оба являются строковыми. Можно ли изменить первый параметр как целое число, как показано ниже:
Map<Integer,String > myLinkedHashMap = new LinkedHashMap<>();
myLinkedHashMap.put(1,"first");
myLinkedHashMap.put(2,"second");
myLinkedHashMap.put(3,"third");
System.out.println(myLinkedHashMap);
JSONObject json = new JSONObject(myLinkedHashMap);
System.out.println(json.toString());
для сортировки в алфавитном порядке, вот правильный способ с Jackson 2.*:
Map<String, String> myLinkedHashMap = new LinkedHashMap<String, String>();
myLinkedHashMap.put("1", "first");
myLinkedHashMap.put("2", "second");
myLinkedHashMap.put("3", "third");
ObjectMapper mapper = new ObjectMapper();
mapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);
try {
System.out.println(mapper.writeValueAsString(myLinkedHashMap));
//prints {"1":"first","2":"second","3":"third"}
} catch (JsonProcessingException e) {
e.printStackTrace();
}
создать JsonArray для упорядоченной пары...
JSONArray orderedJson=new JSONArray();
Iterator iterator= ;
while (iterator.hasNext()) {
Map.Entry me = (Map.Entry)iteratornext();
System.out.print(me.getKey() + ": ");
System.out.println(me.getValue());
JSONObject tmpJson=new JSONObject ();
tmpJson.put(me.getKey(),me.getValue());//add key/value to tmpjson
orderedJson.add(tmpJson);//add tmpjson to orderedJson
}