org.json.JSONObject
для внутреннего использования HashMap
.Они даже добавили некоторые комментарии к нему:
HashMap
используется специально для того, чтобы гарантировать, что элементы не упорядочены в спецификации.JSON
имеет тенденцию быть переносимым форматом передачи, который позволяет реализациям контейнера переупорядочивать свои элементы для более быстрого поиска элементов на основе ассоциативного доступа.Следовательно, реализация не должна полагаться на порядок элемента .
Использование Gson
.Он использует com.google.gson.internal.LinkedTreeMap
реализацию для Map
.Из документации:
Карта сопоставимых ключей к значениям.В отличие от TreeMap
, этот класс использует порядок вставки для порядка итерации.Порядок сравнения используется только в качестве оптимизации для эффективной вставки и удаления.
Эта реализация была получена из класса TreeMap Android 4.1.
Итак, для ниже JSON
payload
:
{
"status": "status",
"date": "01/10/2019",
"abc": {
"Field1": "value1",
"key": "value2"
},
"rgj": {
"key": "value2",
"Field1": "value3"
},
"name": "Rick"
}
Этот пример приложения:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import java.io.File;
import java.io.FileReader;
import java.lang.reflect.Type;
import java.util.Map;
public class GsonApp {
public static void main(String[] args) throws Exception {
File jsonFile = new File("./resource/test.json").getAbsoluteFile();
Gson gson = new GsonBuilder().create();
Type type = new TypeToken<Map<String, Object>>() {
}.getType();
Map<String, Object> map = gson.fromJson(new FileReader(jsonFile), type);
map.forEach((k, v) -> {
if (v instanceof Map) {
System.out.println(k);
((Map) v).forEach((k1, v1) -> System.out.println(" " + k1 + " => " + v1));
} else {
System.out.println(k + " => " + v);
}
});
}
}
Отпечатки:
status => status
date => 01/10/2019
abc
Field1 => value1
key => value2
rgj
key => value2
Field1 => value3
name => Rick
Обратите внимание, что key
и Field1
находятся в разном порядке в abc
иrgj
объектов.