Построение упорядоченной строки JSON из LinkedHashMap

мне нужно было иметь пары ключ / значение в порядке моей вставки, поэтому я решил использовать LinkedHashMap над HashMap. Но мне нужно преобразовать LinkedHashMap в строку JSON, где порядок в LinkedHashMap сохраняется в строке.

но в настоящее время я достигаю это:

  1. первое преобразование LinkedHashMap в JSON.
  2. затем преобразование 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
    }