Werden mit org.json.JSONObject Json Dateien erstellt, werden die ldt. Spezifikation nicht sortiert. Das ist für die Auswertung mitunter schwer zu lesen.
Schauen wir in die Klasse:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public class JSONObject { // ... /** * The map where the JSONObject's properties are kept. */ private final Map<String, Object> map; // ... /** * Construct an empty JSONObject. */ public JSONObject() { // HashMap is used on purpose to ensure that elements are unordered by // the specification. // JSON tends to be a portable transfer format to allows the container // implementations to rearrange their items for a faster element // retrieval based on associative access. // Therefore, an implementation mustn't rely on the order of the item. this.map = new HashMap<String, Object>(); } |
Dann überschreiben wir das mal mit:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
private static JSONObject getSortJSONObject() { JSONObject json = new JSONObject(); // magic zum sortieren der Parameter, so werden die Felder so // geschrieben wie hinzugefügt also sortiert try { // das Feld ist in der JSONObject Klasse so def.: // private final Map<String, Object> map; // wir machen ein neues Object des map Feldes Field neueMap = json.getClass().getDeclaredField("map"); // noch beschreibbar machen, da private neueMap.setAccessible(true); // nun mit LinkedHashMap anstatt HashMap<String, Object>(); neueMap.set(json, new LinkedHashMap<>()); // Zugriff wieder unbeschreibbar, sicher ist sicher neueMap.setAccessible(false); } catch (IllegalAccessException | NoSuchFieldException e) { LOG.error("Error: " + e.getLocalizedMessage()); } return json; } |
Nun noch den vorhandenen Code:
JSONObject json = new JSONObject();
durch
JSONObject json = getSortJSONObject();
ersetzen. Cool reflection …. Goal!… Goal!… Goal!