Зберігайте порядок ключів JSON під час перетворення JSON у CSV


82

Я використовую бібліотеку JSON, надану тут http://www.json.org/java/index.html щоб перетворити рядок json, який я маю, у CSV. Але у мене проблема полягає в тому, що порядок ключів втрачається після перетворення.

Це код перетворення:

    JSONObject jo = new JSONObject(someString);
    JSONArray ja = jo.getJSONArray("items");
    String s = CDL.toString(ja);
    System.out.println(s);

Це вміст "someString":

{
    "items":
    [
        {
            "WR":"qwe",
            "QU":"asd",
            "QA":"end",
            "WO":"hasd",
            "NO":"qwer"
        },
    ]
}

Ось результат:

WO,QU,WR,QA,NO
hasd,asd,qwe,end,qwer

Хоча, як я очікую, слід дотримуватися порядку ключів:

WR,QU,QA,WO,NO
qwe,asd,end,hasd,qwer

Чи можна отримати такий результат за допомогою цієї бібліотеки? Якщо ні, чи існує якась інша бібліотека, яка забезпечить можливість зберігати порядок ключів у результаті?


4
Словники несортовані. Я навіть не думаю, що JSON гарантує порядок.
Фальмаррі

2
дякую за інформацію. Але мені не залишається іншого вибору, крім як використовувати JSON у моїй програмі, і моя програма повинна підтримувати порядок ключів :(
Hery

У моєму випадку проблема полягає не у відсутності порядку, а в тому, що він не є детермінованим. Іноді я отримую ключ fooперед ключем, barа іноді і barраніше foo. Це ускладнює написання тестів.
Шрідхар Сарнобат

Я також стикався з цією потребою, але це для швидкого порівняння журналів під час тестування в режимі реального часу. Мені потрібно порівнювати нещодавно створені журнали з раніше створеними журналами в режимі реального часу для високопрохідного додатка. Є й інші способи зробити це, але я вважаю за краще журнали бути у форматі JSON. Однак, щоб звести до мінімуму використання центрального процесора, я пишу свій власний JSON-розробник прямого до рядка. Мені взагалі не потрібна внутрішня структура, і я можу підтримувати порядок ключів для швидкого порівняння рядків журналів. Є вагомі причини бажати передбачуваного порядку.
Джо Лапп,

напишіть свій власний код, щоб перетворити JSON у спеціально упорядкований файл CSV, таким чином ви поважаєте, якими повинні бути обидва формати.
Martijn Scheffer

Відповіді:


95

Є (хакі) способи зробити це ... але ви не повинні.

У JSON об'єкт визначається таким чином:

Об’єкт - це невпорядкований набір пар ім’я / значення.

Див. Http://json.org .

Більшість реалізацій JSON не докладають зусиль для збереження порядку пар імен / значень об'єкта, оскільки він (за визначенням) несуттєвий.

Якщо ви хочете, щоб порядок зберігався, вам слід перевизначити структуру даних; напр

{
    "items":
    [
        [
            {"WR":"qwe"},
            {"QU":"asd"},
            {"QA":"end"},
            {"WO":"hasd"},
            {"NO":"qwer"}
        ],
    ]
}

або простіше:

{
    "items":
    [
        {"WR":"qwe"},
        {"QU":"asd"},
        {"QA":"end"},
        {"WO":"hasd"},
        {"NO":"qwer"}
    ]
}

СЛІДУВАТИ

Дякую за інформацію, але мені не залишається іншого вибору, крім як використовувати JSON у своєму додатку, і моєму додатку потрібно зберігати порядок ключів незалежно від визначення об'єкта JSON ... Мені не дозволено змінювати формат файлу JSON також...

Вам потрібно важко поспілкуватися з тим, хто створив цю структуру файлів і не дозволить вам її змінити. Це / вони просто помиляються. Вам потрібно їх переконати.

Якщо вони насправді не дозволяють вам змінити це:

  • Вам слід наполягати на тому, щоб не називати це JSON ... тому що це не так.
  • Слід зазначити, що вам доведеться писати / модифікувати код спеціально для обробки цього формату "не JSON" ... якщо ви не знайдете якусь реалізацію JSON, яка зберігає порядок. Якщо вони є клієнтом, який платить, переконайтеся, що вони оплачують цю додаткову роботу, яку вам доведеться зробити.
  • Слід зазначити, що якщо "не JSON" потрібно використовувати якийсь інший інструмент, це буде проблематично. Дійсно, ця проблема буде виникати знову і знову ...

Такі речі настільки погані. З одного боку, ваше програмне забезпечення буде порушувати усталену / давню специфікацію, призначену для сприяння сумісності. З іншого боку, хитромудрі, які створили цей кульгавий (а не JSON!) Формат файлів, напевно, шлакують системи інших людей і т. Д., Тому що системи не можуть впоратися зі своїми нісенітницями.

ОНОВЛЕННЯ

Варто також прочитати, що на це питання говорить JSON RFC (RFC 7159) . Ось кілька уривків:

За роки після публікації RFC 4627 JSON знайшов дуже широке застосування. Цей досвід виявив певні закономірності, які, хоча і дозволяються його специфікаціями, викликали проблеми взаємодії.

JavaScript Object Notation (JSON) - це текстовий формат для серіалізації структурованих даних. ...

JSON може представляти чотири примітивні типи (рядки, числа, булеві значення та null) та два структурованих типи (об'єкти та масиви).

Об’єкт - це невпорядкована колекція з нуля або більше пар ім’я / значення, де ім’я є рядком, а значення - рядком, числом, логічним значенням, нулем, об’єктом або масивом.

Було виявлено, що бібліотеки синтаксичного аналізу JSON різняться щодо того, чи роблять вони порядок членів об’єкта видимим для програм, що викликають. Реалізації, поведінка яких не залежить від упорядкування членів, будуть взаємодіючими в тому сенсі, що ці відмінності на них не вплинуть.


3
@YogeshSomani - "рішення" полягає в тому, щоб отримати належну бібліотеку JSON і "зламати" її, щоб вона зберегла порядок ключів. Див. Відповідь Гері для прикладу. Але не слід сподіватися, що стандартна бібліотека JSON зробить це, оскільки це БАД ІДЕЯ, щоб заохочувати зловживання специфікацією JSON, як це. Реальним рішенням є виправлення вашої програми для правильного використання JSON.
Stephen C

10
чудово бути найчистішим та абсолютнішим, але давайте не будемо жартувати, існують реальні сценарії, коли файл JSON потребує впорядкування визначених значень. Передавати та приймати їх у будь-якому порядку - це фундаментальний json-підхід, але я вважаю це іншим, ніж можливість мати можливість взяти json-документ і серіалізувати / десеріалізувати нарівні. Поширений випадок, коли потрібно взяти документ json і використати його для формування документа іншого стандартного WDDX, HTML тощо, де замовлення потрібно зберігати
Ендрю Норман

3
@AndrewNorman - Якби те, що ви сказали про "потребу", було справді правдою, тоді специфікація повинна бути і була б змінена. Реальність така, що в JSON легко представити замовлення іншими способами.
Stephen C

2
JSON вимагає лише, щоб інформація не кодувалась у порядку ключів; інакше це не JSON. Послідовність серіалізації - це інше питання. В одному додатку узгодженість зазвичай може бути гарантована за допомогою загальної бібліотеки JSON, але є винятки, наприклад, коли одне рішення охоплює кілька платформ або фреймворків. У цих випадках вам або потрібно знайти спосіб подолання непослідовності (введення неефективності), або ви знайдете спосіб забезпечити послідовність. Обидва підходи справедливі.
Джо Лапп,

2
"JSON вимагає лише того, щоб інформація не кодувалася в порядку ключів; інакше це не JSON." . Думаю, ви написали це неправильно. Правильним є твердження, що "JSON не вимагає кодування інформації в порядку ключів". Між цими двома твердженнями є велика різниця ....
Стівен С

47

Підтримувати порядок досить просто. У мене була та ж проблема з підтриманням порядку від рівня БД до шару інтерфейсу користувача.

Відкрийте файл JSONObject.java. Він внутрішньо використовує HashMap, який не підтримує порядок.

Змініть його на LinkedHashMap:

    //this.map = new HashMap();
    this.map = new LinkedHashMap();

Це спрацювало для мене. Повідомте мене в коментарях. Я вважаю, що сама бібліотека JSON повинна мати інший клас JSONObject, який підтримує порядок, наприклад, JSONOrderdObject.java. Я дуже погано підбираю імена.


2
svn checkout json-simple. змінити файл org.json.simple.JSONObject, <code> JOSNObject розширює LinkedHashMap ... </code> з <code> .. HashMap .. </code>, виправляє імпорт, і він працює для мене. v1.1.1.
Марку

2
Це чудове однолінійне рішення, яке я ніколи не думав би спробувати. Працює ідеально, і мені не довелося змінювати будь-який інший код. +1
DaaaahWhoosh

Чудове виправлення. Ти герой, сер
Грегорі Новаковський

не працював, я додав імпорт, змінив його, як ви сказали, навіть спробував зробити це так: this.map = new LinkedHashMap<String, Object>();досі не працює. Будь ласка, допоможіть ?
Тарек

4
Ха-ха справді? Змінення бібліотеки JSON відповідно до ваших потреб? Я просто можу собі уявити, що це потрапляє в основи знань компанії. "Виконайте чисту інсталяцію mvn, завантажте банку, знайдіть її, декомпілюйте, а потім замініть HashMap на LinkedHashMap". Це чудово підійде для груп розробників (не).
Chris Neve,

23

JSONObject.javaбере будь-яку карту, яку ви передасте. Це може бути LinkedHashMapабо TreeMapі він буде прийматиhashmap тільки тоді , коли карта є недійсною.

Ось конструктор JSONObject.javaкласу, який виконуватиме перевірку карти.

 public JSONObject(Map paramMap)
  {
    this.map = (paramMap == null ? new HashMap() : paramMap);
  }

Отже, перед побудовою конструкції об'єкта json, LinkedHashMapа потім передайте її конструктору,

LinkedHashMap<String, String> jsonOrderedMap = new LinkedHashMap<String, String>();

jsonOrderedMap.put("1","red");
jsonOrderedMap.put("2","blue");
jsonOrderedMap.put("3","green");

JSONObject orderedJson = new JSONObject(jsonOrderedMap);

JSONArray jsonArray = new JSONArray(Arrays.asList(orderedJson));

System.out.println("Ordered JSON Fianl CSV :: "+CDL.toString(jsonArray));

Тож немає потреби міняти JSONObject.javaклас. Сподіваюся, це комусь допоможе.


3
Хороша відповідь, працює для звичайної Java, але не працює на Android. Я перевіряю org.json.JSONObject в android, шкода, що android все ще використовує hashmap, створений внутрішньо. Він копіює лише пари імен / значень з paramMap в HashMap ... :(
正宗 白 布鞋

Я замовив JsonObject, але коли я намагаюся додати цей об'єкт до JsonArray, це дає мені невпорядкований. Мені потрібно помістити об'єкт в масив, мені потрібні об'єкти масиву, потім я ставлю заголовок до масиву і відправляю назад. Приклад: один предмет; {CUSTOMER_SECTOR_ID = 611, CUSTOMER_NO = 0000003204, CUSTOMER_NAME = MARMARİS - KARAS GIDA KARAS TÜKETİM MADDELERİ GIDA LOJ.} Я отримую це, якщо я поміщаю два об’єкти в масив: [{"CUSTOMER_NAME": "SILA GAM" 0000003122 "," CUSTOMER_SECTOR_ID ":" 611 "}, {" CUSTOMER_NAME ":" M ":" 0013114714 "," CUSTOMER_SECTOR_ID ":" 611 "}] Як ви бачите, це неправильно. Як я можу це виправити
Sahin Yanlık

2
@Deepak Nagaraj. Я спробував ваше рішення, але воно не спрацювало, JSONObjectвоно не замовлено як моє LinkedHashMap. Ви використовуєте org.jsonlib?
Ісмаїл Сен

1
Це не той org.json.. Він визначає HashMapвнутрішньо, що б Mapви йому не дали: @Deepak, чи можете ви вказати нам на реалізацію, яку ви використовували?
Кампа

8
Це не спрацює з org.jsonбібліотекою. Коли ви створюєте новий JSONObjectоб'єкт, передаючи карту як аргумент, він завжди буде перетворений у HashMap. Спочатку конструктор створює нову карту:, this.map = new HashMap<String, Object>();а потім цикл над вашою картою, копіюючи кожен елемент на свою HashMap.
itachi

13

Більш багатослівним, але широко застосовуваним рішенням такого роду проблем є використання пари структур даних: списку, який міститиме впорядкування, і мапи, що містить відносини.

Наприклад:

{
    "items":
    [
        {
            "WR":"qwe",
            "QU":"asd",
            "QA":"end",
            "WO":"hasd",
            "NO":"qwer"
        },
    ],
    "itemOrder":
        ["WR", "QU", "QA", "WO", "NO"]
}

Ви повторюєте список itemOrder і використовуєте їх для пошуку значень карти. Порядок збережений, без клубів.

Я використовував цей метод багато разів.


Це ускладнюється, якщо ваша карта - це не просто прості пари ключ-значення ...
zfj3ub94rf576hc4eegm

10

Ще одне хакерське рішення з використанням Reflection:

JSONObject json = new JSONObject();
Field map = json.getClass().getDeclaredField("map");
map.setAccessible(true);//because the field is private final...
map.set(json, new LinkedHashMap<>());
map.setAccessible(false);//return flag

1
Я не отримав вашої відповіді
М. Усман-хан,

1
Фокус полягає у внутрішній зміні класу, щоб використовувати LinkedHashMap замість HashMap за замовчуванням, роблячи об’єкт JSON даними в тому порядку, в якому ви їх розміщуєте, це не сортується безпосередньо, але це спрацювало для мене, оскільки аналізовані дані вже відсортовані .
fabe

виглядає добре, але як проаналізувати рядок Json ПІСЛЯ map.set (json, новий LinkedHashMap <> ()); тому що Json String передається в конструктор, чи не так? як, новий JSONObject (jsonString).
М. Усман-хан

Крім того, це не спрацювало. немає поля "map", є поле "nameValuePairs", яке вже є LinckedHashMap, і воно все ще не працює.
М. Усман-хан

1
Яку реалізацію JSONObject ви використовуєте? Я використовую org.json версії 20140107 і повинен був зберегти порядок, і ось як це працювало для мене.
fabe


4

Щойно натрапивши на ту саму проблему, я вважаю, що остаточне рішення, яке використовував автор, полягало у використанні власної ContainerFactory:

public static Values parseJSONToMap(String msgData) {
    JSONParser parser = new JSONParser();
    ContainerFactory containerFactory = new ContainerFactory(){
        @Override
        public Map createObjectContainer() {
            return new LinkedHashMap();
        }

        @Override
        public List creatArrayContainer() {
            return null;
        }
    };
    try {
        return (Map<String,Object>)parser.parse(msgData, containerFactory);
    } catch (ParseException e) {
        log.warn("Exception parsing JSON string {}", msgData, e);
    }
    return null;
}  

див. http://juliusdavies.ca/json-simple-1.1.1-javadocs/org/json/simple/parser/JSONParser.html#parse(java.io.Reader,org.json.simple.parser.ContainerFactory)


дійсно дуже хороше і практичне рішення. Як щодо написання методу локального анонімного внутрішнього класу для containerFactory?
Shailesh Saxena,

3

Вирішено.

Я використовував бібліотеку JSON.simple звідси https://code.google.com/p/json-simple/, щоб прочитати рядок JSON, щоб зберегти порядок ключів, і використовувати бібліотеку JavaCSV тут http://sourceforge.net/ projects / javacsv / для перетворення у формат CSV.


Я здивований, що це спрацювало. Згідно з моїм прочитанням коду та коментарів класу JSONObject ( code.google.com/p/json-simple/source/browse/trunk/src/main/java/… ), він нічого не робить для збереження порядок ключів.
Stephen C

1
Я не вказав тут повне рішення, але суть його полягає в тому, що json-simple надає фабрику, за допомогою якої ви можете вказати структуру даних, що використовується для зберігання об'єктів json. Просто вкажіть, як використовувати LinkedHashMap.
Hery

@ Гері, я стикаюся з такою ж проблемою, але не зміг її вирішити. Я використовую , org.jsonщоб перетворити , List<LinkedHahMap>щоб JSONArrayдля того , щоб створити CSV, то CSVстворюється , але не в такому самому порядку , як і мої List . Я намагався використати дві бібліотеки, які ви представляєте тут, але мені не вдалося знайти методи перетворення. CSVБудь ласка, надайте докладнішу інформацію.
Ісмаїл Сен

2

Я знаю, що це вирішено, і питання було задано давно, але, оскільки я маю справу з подібною проблемою, я хотів би надати зовсім інший підхід до цього:

Для масивів написано: "Масив - це впорядкована колекція значень". за адресою http://www.json.org/ - але об’єкти («Об’єкт - це невпорядкований набір пар ім’я / значення.») не впорядковуються.

Цікаво, чому цей об’єкт знаходиться у масиві - це означає порядок, якого там немає.

{
"items":
[
    {
        "WR":"qwe",
        "QU":"asd",
        "QA":"end",
        "WO":"hasd",
        "NO":"qwer"
    },
]
}

Отже, рішенням було б помістити ключі в "справжній" масив і додати дані як об'єкти до кожного ключа, як це:

{
"items":
[
    {"WR": {"data": "qwe"}},
    {"QU": {"data": "asd"}},
    {"QA": {"data": "end"}},
    {"WO": {"data": "hasd"}},
    {"NO": {"data": "qwer"}}
]
}

Отже, це підхід, який намагається переосмислити оригінальне моделювання та його наміри. Але я не перевіряв (і мені цікаво), чи всі залучені інструменти збережуть порядок цього оригінального масиву JSON.


1
це не дозволяє мені шукати ключ.
mickeymoon

Тоді що ти хочеш - хеш чи щось замовлене !? Якщо ви хочете поєднати обидва, то створіть обидві, і одна з цих структур проіндексує іншу .... інакше це, здається, більше проблема дизайну або змішування інтересів.
cslotty

1
мова не йде про змішування інтересів, це досить правдоподібний випадок використання, який у таких мовах, як Java, обробляється такими конструкціями, як LinkedHashMap, упорядкована карта, яка зберігає порядок вставки. Тоді, що я хочу, я хочу, щоб обидва мали можливість ітерації на клавішах у визначеному порядку та також швидкого пошуку на клавішах. Я думаю, що відповідь @Robotic Pants спрацювала б в значній мірі, хоча і трохи хакерська.
mickeymoon

Це правда, Міккімоун, я збирався це сказати! Але в JSON цього не існує, правда? Тоді вам доведеться залучати мови / механізми, які забезпечують вам таке.
cslotty

1

У реальному світі додаток майже завжди матиме компонент Java або домен, який слід серіалізувати / десеріалізувати в / з JSON. Вже згадувалося, що специфікація об'єкта JSON не гарантує порядок і будь-які маніпуляції з цією поведінкою не виправдовують вимоги. У моїй програмі був той самий сценарій, коли мені потрібно було зберегти порядок лише з міркуванням читабельності. Я використав стандартний спосіб Джексона для серіалізації мого Java-файлу до JSON:

Object object = getObject();  //the source java bean that needs conversion
String jsonString = new com.fasterxml.jackson.databind.ObjectMapper().writeValueAsString(object);

Для того, щоб зробити json із упорядкованим набором елементів, я просто використовую анотацію властивостей JSON у Java-компоненті, який я використовував для перетворення. Приклад нижче:

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({"name","phone","city","id"})
public class SampleBean implements Serializable {
    private int id;
    private String name:
    private String city;
    private String phone;

    //...standard getters and setters
}

використовуваний вище getObject ():

public SampleBean getObject(){
    SampleBean bean  = new SampleBean();
    bean.setId("100");
    bean.setName("SomeName");
    bean.setCity("SomeCity");
    bean.setPhone("1234567890");
    return bean;
}

Вихідні дані відображаються відповідно до анотації порядку замовлення властивостей Json:

{
    name: "SomeName",
    phone: "1234567890",
    city: "SomeCity",
    id: 100
}

0

Найбільш безпечним способом є, мабуть, метод перевизначення ключів, який використовується для генерації результату:

new JSONObject(){
  @Override
  public Iterator keys(){
    TreeSet<Object> sortedKeys = new TreeSet<Object>();
    Iterator keys = super.keys();
    while(keys.hasNext()){
      sortedKeys.add(keys.next());
    }
    return sortedKeys.iterator();
  }
};

1
Це не вирішує заявлену проблему. Це спричиняє сортування ключів ... але питання вимагає збереження порядку вставки.
Стівен С

0

patchFor (відповідь @gary):

$ git diff JSONObject.java                                                         
diff --git a/JSONObject.java b/JSONObject.java
index e28c9cd..e12b7a0 100755
--- a/JSONObject.java
+++ b/JSONObject.java
@@ -32,7 +32,7 @@ import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.util.Collection;
 import java.util.Enumeration;
-import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.Iterator;
 import java.util.Locale;
 import java.util.Map;
@@ -152,7 +152,9 @@ public class JSONObject {
      * Construct an empty JSONObject.
      */
     public JSONObject() {
-        this.map = new HashMap<String, Object>();
+//      this.map = new HashMap<String, Object>();
+        // I want to keep order of the given data:
+        this.map = new LinkedHashMap<String, Object>();
     }

     /**
@@ -243,7 +245,7 @@ public class JSONObject {
      * @throws JSONException
      */
     public JSONObject(Map<String, Object> map) {
-        this.map = new HashMap<String, Object>();
+        this.map = new LinkedHashMap<String, Object>();
         if (map != null) {
             Iterator<Entry<String, Object>> i = map.entrySet().iterator();
             while (i.hasNext()) {

0

Ви можете використовувати такий код, щоб виконати замовлену серіалізацію та десеріалізацію масиву JSON (Цей приклад передбачає, що ви замовляєте рядки, але їх можна застосувати до всіх типів):

Серіалізація

JSONArray params = new JSONArray();
int paramIndex = 0;

for (String currParam : mParams)
{
    JSONObject paramObject = new JSONObject();
    paramObject.put("index", paramIndex);
    paramObject.put("value", currParam);

    params.put(paramObject);
    ++paramIndex;
}

json.put("orderedArray", params);

Десериалізація

JSONArray paramsJsonArray = json.optJSONArray("orderedArray");
if (null != paramsJsonArray)
{
    ArrayList<String> paramsArr = new ArrayList<>();
    for (int i = 0; i < paramsJsonArray.length(); i++)
    {
        JSONObject param = paramsJsonArray.optJSONObject(i);
        if (null != param)
        {
            int paramIndex = param.optInt("index", -1);
            String paramValue = param.optString("value", null);

            if (paramIndex > -1 && null != paramValue)
            {
                paramsArr.add(paramIndex, paramValue);
            }
        }
    }
}

0

Ваш приклад:

{
    "items":
    [
        {
            "WR":"qwe",
            "QU":"asd",
            "QA":"end",
            "WO":"hasd",
            "NO":"qwer"
        },
        ...
    ]
}

додати елемент "itemorder"

{
    "items":
    [
        {
            "WR":"qwe",
            "QU":"asd",
            "QA":"end",
            "WO":"hasd",
            "NO":"qwer"
        },
        ...
    ],
    "itemorder":["WR","QU","QA","WO","NO"]
}

Цей код генерує бажаний результат без рядка заголовка стовпця:

JSONObject output = new JSONObject(json);
JSONArray docs = output.getJSONArray("data");
JSONArray names = output.getJSONArray("itemOrder");
String csv = CDL.toString(names,docs);

Це видалило заголовок CSV, тепер у мене рядки впорядковані, але без заголовка
Педро Хоакін

0

замість використання jsonObject спробуйте простіше використовувати CsvSchema і безпосередньо перетворює об'єкт на csv

CsvSchema schema = csvMapper.schemaFor(MyClass.class).withHeader();
        csvMapper.writer(schema).writeValueAsString(myClassList);

і mentains ідентифікатор замовлення ваше POJO має @JsonPropertyOrder в ньому


0

Underscore-java зберігає замовлення на елементи під час читання json. Я - супровідник проекту.

String json = "{\n"
      + "    \"items\":\n"
      + "    [\n"
      + "        {\n"
      + "            \"WR\":\"qwe\",\n"
      + "            \"QU\":\"asd\",\n"
      + "            \"QA\":\"end\",\n"
      + "            \"WO\":\"hasd\",\n"
      + "            \"NO\":\"qwer\"\n"
      + "        }\n"
      + "    ]\n"
      + "}";
System.out.println(U.fromJson(json));

// {items=[{WR=qwe, QU=asd, QA=end, WO=hasd, NO=qwer}]}

-1

Перевірив рішення підморгування і працює нормально:

@Test
public void testJSONObject() {
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("bbb", "xxx");
    jsonObject.put("ccc", "xxx");
    jsonObject.put("aaa", "xxx");
    jsonObject.put("xxx", "xxx");
    System.out.println(jsonObject.toString());
    assertTrue(jsonObject.toString().startsWith("{\"xxx\":"));
}

@Test
public void testWinkJSONObject() throws JSONException {
    org.apache.wink.json4j.JSONObject jsonObject = new OrderedJSONObject();
    jsonObject.put("bbb", "xxx");
    jsonObject.put("ccc", "xxx");
    jsonObject.put("aaa", "xxx");
    jsonObject.put("xxx", "xxx");
    assertEquals("{\"bbb\":\"xxx\",\"ccc\":\"xxx\",\"aaa\":\"xxx\",\"xxx\":\"xxx\"}", jsonObject.toString());
}

Залежність Maven: <dependency> <groupId> org.apache.wink </groupId> <artifactId> wink-json4j </artifactId> <version> 1.4 </version> </dependency>
jgpelaez

Та сама відповідь, що і @cypressious ... опубліковано 2 роки тому. І приклад не додає реальної вартості.
Stephen C,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.