Mantenga el orden de las claves JSON durante la conversión de JSON a CSV

82

Estoy usando la biblioteca JSON proporcionada aquí http://www.json.org/java/index.html para convertir una cadena json que tengo a CSV. Pero el problema que tengo es que el orden de las claves se pierde después de la conversión.

Este es el código de conversión:

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

Este es el contenido de "someString":

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

Este es el resultado:

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

Si bien lo que espero es mantener el orden de las claves:

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

¿Hay alguna forma de que pueda obtener este resultado usando esta biblioteca? Si no es así, ¿hay alguna otra biblioteca que proporcione la capacidad de mantener el orden de las claves en el resultado?

Hery
fuente
4
Los diccionarios no están clasificados. Ni siquiera creo que JSON garantice el orden.
Falmarri
2
Gracias por la info. Pero no tengo más remedio que usar JSON en mi aplicación y mi aplicación debe mantener el orden de las claves :(
Hery
En mi caso, el problema no es la falta de orden, sino que no es determinista. A veces obtengo la clave fooantes que la clave bary, a veces, barantes foo. Esto hace que sea difícil escribir pruebas para.
Sridhar Sarnobat
También encontré esta necesidad, pero es para una rápida comparación de registros durante las pruebas en tiempo real. Necesito comparar los registros recién generados con los registros generados anteriormente en tiempo real para una aplicación de alto rendimiento. Hay otras formas de hacerlo, pero prefiero que los registros estén en formato JSON. Sin embargo, para minimizar el uso de la CPU, estoy escribiendo mi propio escritor JSON directo a cadena. No necesito la estructura interna en absoluto, y puedo mantener el orden de las claves para comparaciones rápidas de cadenas de registros. Hay buenas razones para querer un orden predecible.
Joe Lapp
escriba su propio código para convertir JSON en un archivo CSV específicamente ordenado, de esa manera respetará lo que se supone que son ambos formatos.
Martijn Scheffer

Respuestas:

95

Hay formas (hacky) de hacerlo ... pero no deberías.

En JSON, un objeto se define así:

Un objeto es un conjunto desordenado de pares de nombre / valor.

Consulte http://json.org .

La mayoría de las implementaciones de JSON no hacen ningún esfuerzo por preservar el orden de los pares nombre / valor de un objeto, ya que (por definición) no es significativo.

Si desea conservar el orden, debe redefinir su estructura de datos; p.ej

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

o más simplemente:

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

SEGUIMIENTO

Gracias por la información, pero no tengo más remedio que usar JSON en mi aplicación y mi aplicación necesita mantener el orden de las claves independientemente de la definición del objeto JSON ... No puedo cambiar el formato del archivo JSON también...

Necesita tener una conversación dura con quien diseñó esa estructura de archivos y no le permitirá cambiarla. Es / están completamente equivocados. Usted necesita para convencerlos.

Si realmente no te dejan cambiarlo:

  • Deberías insistir en no llamarlo JSON ... porque no lo es.
  • Debe señalar que tendrá que escribir / modificar código especialmente para manejar este formato "no JSON" ... a menos que pueda encontrar alguna implementación JSON que conserve el orden. Si es un cliente que paga, asegúrese de que pague por este trabajo adicional que tiene que hacer.
  • Debe señalar que si el "no JSON" necesita ser utilizado por alguna otra herramienta, será problemático. De hecho, este problema se repetirá una y otra vez ...

Este tipo de cosas son realmente malas. Por un lado, su software violará una especificación bien establecida / de larga data que está diseñada para promover la interoperabilidad. Por otro lado, los imbéciles que diseñaron este formato de archivo poco convincente (¡no JSON!) Probablemente se estén burlando de los sistemas de otras personas, etc. porque los sistemas no pueden hacer frente a sus tonterías.

ACTUALIZAR

También vale la pena leer lo que dice JSON RFC (RFC 7159) sobre este tema. Aquí hay algunos extractos:

En los años transcurridos desde la publicación de RFC 4627, JSON ha encontrado un uso muy amplio. Esta experiencia ha revelado ciertos patrones que, aunque permitidos por sus especificaciones, han causado problemas de interoperabilidad.

La notación de objetos JavaScript (JSON) es un formato de texto para la serialización de datos estructurados. ...

JSON puede representar cuatro tipos primitivos (cadenas, números, booleanos y nulos) y dos tipos estructurados (objetos y matrices).

Un objeto es una colección desordenada de cero o más pares de nombre / valor, donde un nombre es una cadena y un valor es una cadena, número, booleano, nulo, objeto o matriz.

Se ha observado que las bibliotecas de análisis JSON difieren en cuanto a si hacen visible o no el orden de los miembros del objeto para el software de llamada. Las implementaciones cuyo comportamiento no dependa del orden de los miembros serán interoperables en el sentido de que no se verán afectadas por estas diferencias.

Esteban C
fuente
6
@Hery - facturales :-)
Stephen C
3
@YogeshSomani: la "solución" es conseguir una biblioteca JSON adecuada y "piratearla" para que conserve el orden de las claves. Vea la respuesta de gary para ver un ejemplo. Pero no debe esperar que una biblioteca JSON estándar haga esto porque es una MALA IDEA fomentar el abuso de la especificación JSON de esta manera. La verdadera solución es arreglar su aplicación para que use JSON correctamente.
Stephen C
10
es genial ser el más puro y absoluto, pero no nos engañemos, hay escenarios del mundo real en los que un archivo JSON necesita que se conserve el orden de sus valores definidos. Pasarlos y aceptarlos en cualquier orden es un enfoque json fundamental, pero lo considero diferente a la capacidad de poder tomar un documento json y serializar / deserializar en igualdad. Es un caso de uso común tener que tomar un documento json y usarlo para formar un documento de otro WDDX, HTML, etc. estándar donde se debe preservar el pedido
Andrew Norman
3
@AndrewNorman - Si lo que dijiste sobre "necesidad" fuera realmente cierto, entonces la especificación debería ser y se habría cambiado. La realidad es que es fácil representar los pedidos de otras formas en JSON.
Stephen C
2
JSON solo requiere que la información no esté codificada en el orden de las claves; no es JSON de lo contrario. La coherencia de la serialización es un tema diferente. Dentro de una sola aplicación, la coherencia generalmente se puede garantizar mediante el uso de una biblioteca JSON común, pero hay excepciones, como cuando una sola solución abarca múltiples plataformas o marcos. En estos casos, debe encontrar una manera de lidiar con la inconsistencia (introduciendo ineficiencia), o debe encontrar una manera de garantizar la coherencia. Ambos enfoques son válidos.
Joe Lapp
47

Mantener el orden es bastante sencillo. Tuve el mismo problema al mantener el orden de la capa DB a la capa UI.

Abra el archivo JSONObject.java. Utiliza internamente HashMap que no mantiene el orden.

Cámbielo a LinkedHashMap:

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

Esto funcionó para mí. Házmelo saber en los comentarios. Sugiero que la biblioteca JSON en sí debería tener otra clase JSONObject que mantenga el orden, como JSONOrderdObject.java. Soy muy pobre para elegir los nombres.

Gary
fuente
2
svn pago y envío json-simple. modificar el archivo org.json.simple.JSONObject, <code> JOSNObject extiende LinkedHashMap ... </code> de <code> .. HashMap .. </code>, arregla las importaciones y funciona para mí. v1.1.1.
Marku
2
Esta es una gran solución de una línea que nunca se me hubiera ocurrido probar. Funciona perfectamente y no tuve que cambiar ninguno de mis otros códigos. +1
DaaaahWhoosh
Gran arreglo. Eres un héroe, señor
Gregory Nowakowski
no funcionó, agregué la importación, la cambié como dijiste, incluso traté de hacerlo así: this.map = new LinkedHashMap<String, Object>();todavía no funciona. Por favor ayuda ?
Tarek
4
¿Jajaja de verdad? ¿Modifica la biblioteca JSON para satisfacer sus necesidades? Me puedo imaginar que esto ocurra en las bases de conocimiento de la empresa. "Realice una instalación limpia de mvn, descargue el archivo jar, búsquelo, descompílelo y luego reemplace HashMap con LinkedHashMap". Esto funcionará muy bien para equipos de desarrolladores múltiples (no).
Chris Neve
22

JSONObject.javatoma cualquier mapa que pase. Puede ser LinkedHashMapo TreeMapy hashmapsolo tomará cuando el mapa sea nulo.

Aquí está el constructor de la JSONObject.javaclase que hará la verificación del mapa.

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

Entonces, antes de construir una construcción de objeto json LinkedHashMapy luego pasarla al constructor de esta manera,

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));

Entonces no es necesario cambiar la JSONObject.javaclase. Espero que ayude a alguien.

Deepak Nagaraj
fuente
3
Buena respuesta, funciona para Java normal, pero no funciona en Android. Verifico org.json.JSONObject en Android, es una pena que Android todavía use hashmap creado internamente. Solo copia pares de nombre / valor de paramMap a HashMap ... :(
正宗 白 布鞋
Ordené JsonObject pero cuando intento agregar ese objeto a un JsonArray, me da uno desordenado. Necesito poner el objeto en la matriz, necesito objetos de la matriz, luego pongo el encabezado en la matriz y lo devuelvo. Ej: un objeto; {CUSTOMER_SECTOR_ID = 611, CUSTOMER_NO = 0000003204, CUSTOMER_NAME = MARMARİS - KARAS GIDA KARAS TÜKETİM MADDELERİ GIDA LOJ.} Obtengo esto si coloco dos objetos en la matriz: [{"CUSTOMER_NAME": "SILA GIDA" PAZARLAMA " 0000003122 "," CUSTOMER_SECTOR_ID ":" 611 "}, {" CUSTOMER_NAME ":" M ":" 0013114714 "," CUSTOMER_SECTOR_ID ":" 611 "}] Como ve, está mal. ¿Cómo puedo solucionarlo?
Sahin Yanlık
2
@Deepak Nagaraj. Probé su solución pero no funcionó, JSONObjectno está ordenado como my LinkedHashMap. ¿Estás usando org.jsonlib?
Ismail Sen
1
Esta no es la indicada org.json.. Define una HashMapinternamente, sea lo Mapque sea ​​que le des: @Deepak, ¿puedes señalarnos la implementación que usaste?
Campa
8
Esto no funcionará con la org.jsonbiblioteca. Cuando construye un nuevo JSONObjectobjeto, pasando un mapa como argumento, siempre se convertirá a HashMap. El constructor primero crea un nuevo mapa:, this.map = new HashMap<String, Object>();y luego recorre su mapa, copiando cada elemento en el suyo HashMap.
itachi
13

Una solución más detallada, pero ampliamente aplicable a este tipo de problema, es utilizar un par de estructuras de datos: una lista para contener el orden y un mapa para contener las relaciones.

Por ejemplo:

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

Se itera la lista itemOrder y se utilizan para buscar los valores del mapa. El orden se conserva, sin errores.

He usado este método muchas veces.

Pantalones robóticos
fuente
Esto se vuelve complicado si su mapa no son simples pares clave-valor ...
zfj3ub94rf576hc4eegm
10

Otra solución hacky usando reflect:

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
fabe
fuente
1
No recibí su respuesta
M. Usman Khan
1
El truco es modificar la clase internamente para usar un LinkedHashMap en lugar del HashMap predeterminado, haciendo que el objeto JSON tenga los datos en el orden en que los puso, esto no está directamente ordenado pero funcionó para mí ya que los datos analizados ya están ordenados .
fabe
se ve bien, pero cómo analizar Json String DESPUÉS de map.set (json, new LinkedHashMap <> ()); porque Json String se pasa en el constructor, ¿verdad? como, nuevo JSONObject (jsonString).
M. Usman Khan
Además, esto no funcionó. no hay un campo "mapa", hay un campo "nameValuePairs" que ya es LinckedHashMap, y todavía no funciona.
M. Usman Khan
1
¿Qué implementación del JSONObject estás usando? Estoy usando org.json versión 20140107 y tuve que preservar el orden y así funcionó para mí.
fabe
4

Me encontré con el mismo problema, creo que la solución final utilizada por el autor consistió en usar un ContainerFactory personalizado:

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;
}  

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

Rafael
fuente
Solución realmente muy buena y práctica. ¿Qué tal escribir la clase interna anónima local del método para containerFactory?
Shailesh Saxena
3

Resuelto.

Usé la biblioteca JSON.simple desde aquí https://code.google.com/p/json-simple/ para leer la cadena JSON para mantener el orden de las claves y usar la biblioteca JavaCSV desde aquí http://sourceforge.net/ proyectos / javacsv / para convertir a formato CSV.

Hery
fuente
Me sorprende que esto haya funcionado. Según mi lectura tanto del código como de los comentarios de la clase JSONObject ( code.google.com/p/json-simple/source/browse/trunk/src/main/java/… ), no hace nada para preservar el orden de las llaves.
Stephen C
1
No especifiqué la solución completa aquí, pero la esencia es que json-simple proporciona una fábrica con la que puede especificar la estructura de datos utilizada para almacenar objetos json. Simplemente especifique para usar LinkedHashMap.
Hery
@ Hery, estoy enfrentando el mismo problema, pero no pude resolverlo. Utilizo org.jsonpara convertir List<LinkedHahMap>a JSONArraypara crear un CSV, CSVse crea pero no en el mismo orden que mi List . Intenté usar las dos bibliotecas que presenta aquí, pero no pude encontrar los métodos para convertir a CSV. ¿Podría por favor dar más detalles?
Ismail Sen
2

Sé que esto está resuelto y la pregunta se hizo hace mucho tiempo, pero como estoy lidiando con un problema similar, me gustaría darle un enfoque totalmente diferente a esto:

En el caso de matrices, dice "Una matriz es una colección ordenada de valores". en http://www.json.org/ - pero los objetos ("Un objeto es un conjunto desordenado de pares de nombre / valor") no están ordenados.

Me pregunto por qué ese objeto está en una matriz, eso implica un orden que no está allí.

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

Entonces, una solución sería poner las claves en una matriz "real" y agregar los datos como objetos a cada clave de esta manera:

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

Así que este es un enfoque que intenta repensar el modelado original y su intención. Pero no he probado (y me pregunto) si todas las herramientas involucradas preservarían el orden de esa matriz JSON original.

cslotty
fuente
1
esto no me permite buscar la clave.
mickeymoon
Entonces, ¿qué quieres, un hash o algo ordenado? Si desea combinar ambos, cree ambos y haga que una de esas estructuras indexe la otra ... de lo contrario, esto parece ser más un problema de diseño o una mezcla de intereses.
cslotty
1
no se trata de mezclar intereses, es un caso de uso bastante plausible, que en lenguajes como Java se maneja mediante construcciones como LinkedHashMap, un mapa ordenado que conserva el orden de inserción. Entonces, ¿qué quiero? Quiero que ambos puedan iterar en las claves en el orden definido y hacer una búsqueda rápida de las claves también. Creo que la respuesta de @Robotic Pants funcionaría bastante bien, aunque es un poco pirateada.
mickeymoon
Es cierto, mickeymoon, ¡estaba a punto de decir eso! Pero en JSON esto no existe, ¿verdad? Entonces tendrías que involucrar lenguajes / mecanismos, que te proporcionen tal cosa.
cslotty
1

En el mundo real, una aplicación casi siempre tendrá un bean o dominio Java que se va a serializar / deserializar a / desde JSON. Ya se mencionó que la especificación del objeto JSON no garantiza el orden y cualquier manipulación de ese comportamiento no justifica el requisito. Tuve el mismo escenario en mi aplicación en el que necesitaba preservar el orden solo por motivos de legibilidad. Usé la forma estándar de jackson para serializar mi bean java a JSON:

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

Para hacer el json con un conjunto ordenado de elementos, solo uso la anotación de propiedad JSON en el bean Java que usé para la conversión. Un ejemplo a continuación:

@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
}

el getObject () utilizado anteriormente:

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

La salida se muestra según la anotación de orden de propiedad de Json:

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

La forma más segura es probablemente anular el método de claves que se utiliza para generar resultados:

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();
  }
};
Kardigen
fuente
1
Esto no resuelve el problema indicado. Hace que las claves se ordenen ... pero la pregunta solicita que se conserve el orden de inserción.
Stephen C
0

patchFor (respuesta @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()) {
Campa
fuente
0

Puede utilizar el siguiente código para realizar una serialización ORDENADA personalizada y una deserialización de JSON Array (este ejemplo asume que está ordenando cadenas pero se puede aplicar a todos los tipos):

Publicación por entregas

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);

Deserialización

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);
            }
        }
    }
}
Muzikant
fuente
0

Tu ejemplo:

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

agregar un elemento "itemorder"

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

Este código genera la salida deseada sin la línea de título de la columna:

JSONObject output = new JSONObject(json);
JSONArray docs = output.getJSONArray("data");
JSONArray names = output.getJSONArray("itemOrder");
String csv = CDL.toString(names,docs);
Adriano
fuente
Esto quitó el encabezado del CSV, ahora tengo las filas ordenadas pero sin encabezado
Pedro Joaquín
0

en lugar de usar jsonObject, intente usar CsvSchema de manera más fácil y convierta directamente el objeto a csv

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

y mentaliza la identificación de la orden que su pojo tiene @JsonPropertyOrder en ella

rahul
fuente
0

Underscore-java mantiene los pedidos de elementos mientras lee json. Soy el mantenedor del proyecto.

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}]}
Valentyn Kolesnikov
fuente
-1

Probé la solución de guiño y funcionó bien:

@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());
}
jgpelaez
fuente
Dependencia de Maven: <dependency> <groupId> org.apache.wink </groupId> <artifactId> wink-json4j </artifactId> <version> 1.4 </version> </dependency>
jgpelaez
Misma respuesta que @cypressious ... publicado 2 años antes. Y el ejemplo no aporta ningún valor real.
Stephen C