Java 保持列表<;LinkedHashMap<;字符串,对象>&燃气轮机;与JSONArray对话时的顺序

Java 保持列表<;LinkedHashMap<;字符串,对象>&燃气轮机;与JSONArray对话时的顺序,java,json,list,arrays,Java,Json,List,Arrays,我看过所有关于在JSONArray中维持秩序的帖子,但我找不到解决办法 在这篇文章中,他们说:数组是值的有序集合。 但是,当我从我的列表创建JSONArray时,我丢失了订单,我必须保留它 我尝试了所有的解决方案,但没有一个对我有效 我使用org.json作为jsonlib创建JSONArray,然后CDL创建CSV 列表包含JSON,因此我可以创建一个CSV文件 代码: List<LinkedHashMap<String, Object>> stringObject=n

我看过所有关于在JSONArray中维持秩序的帖子,但我找不到解决办法

在这篇文章中,他们说:
数组是值的有序集合。

但是,当我从我的
列表创建
JSONArray
时,我丢失了订单,我必须保留它

我尝试了所有的解决方案,但没有一个对我有效

我使用
org.json
作为
json
lib创建
JSONArray
,然后
CDL
创建
CSV

列表包含
JSON
,因此我可以创建一个
CSV
文件

代码:

List<LinkedHashMap<String, Object>> stringObject=new ArrayList<LinkedHashMap<String,Object>>();

for(...; ...;...){
        stringObject.add(map);
    }
/** stringObject is a List containing ordered map */

/** Here I'm trying to create a JSONArray */

JSONARRay jsonArray=new JSONArray(stringObject);
如你所见,我把订单弄丢了

那么,如何保持正确的顺序,以便我可以创建一个好的
CSV

尊重
map
顺序,但不尊重
map
中的项目顺序

编辑

我要添加到
列表中的地图

{_id=1, name=Aurelia Menendez, scores.0.type=exam, scores.0.score=60.06045071030959, scores.1.type=quiz, scores.1.score=52.79790691903873, scores.2.type=homework, scores.2.score=71.76133439165544}
{_id=2, name=Corliss Zuk, scores.0.type=exam, scores.0.score=67.03077096065002, scores.1.type=quiz, scores.1.score=6.301851677835235, scores.2.type=homework, scores.2.score=66.28344683278382}
{_id=3, name=Bao Ziglar, scores.0.type=exam, scores.0.score=71.64343899778332, scores.1.type=quiz, scores.1.score=24.80221293650313, scores.2.type=homework, scores.2.score=42.26147058804812}
{_id=4, name=Zachary Langlais, scores.0.type=exam, scores.0.score=78.68385091304332, scores.1.type=quiz, scores.1.score=90.2963101368042, scores.2.type=homework, scores.2.score=34.41620148042529}
{_id=11, name=Marcus Blohm, scores.0.type=exam, scores.0.score=78.42617835651868, scores.1.type=quiz, scores.1.score=82.58372817930675, scores.2.type=homework, scores.2.score=87.49924733328717}
{_id=12, name=Quincy Danaher, scores.0.type=exam, scores.0.score=54.29841278520669, scores.1.type=quiz, scores.1.score=85.61270164694737, scores.2.type=homework, scores.2.score=80.40732356118075}
{_id=15, name=Tambra Mercure, scores.0.type=exam, scores.0.score=69.1565022533158, scores.1.type=quiz, scores.1.score=3.311794422000724, scores.2.type=homework, scores.2.score=45.03178973642521}
使用JSONObject:

JSONObject jsonObject=new JSONObject();
for(LinkedHashMap<String,Object> map:stringObject){

    jsonObject.putAll(map);
    System.out.println(jsonObject);
}

伊斯梅尔

从你的问题中,我认为你没有得到与输出顺序相同的插入顺序。 我只是仔细检查了一下,发现你错了。我已经做了下面的事情并得到了下面的输出

/*******************output*************/



[{"val0":"val0"},{"val1":"val1"},{"val2":"val2"},{"val3":"val3"},{"val4":"val4"},{"val5":"val5"},{"val6":"val6"},{"val7":"val7"},{"val8":"val8"},{"val9":"val9"}]

/********************************/

 /************** Code****************/

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

import org.json.JSONArray;

public class TestOrderArrayList {

public static void main(String[] args) {
    List<LinkedHashMap<String, Object>> stringObject = new ArrayList<LinkedHashMap<String, Object>>();

    for (int i = 0; i < 10; i++) {
        LinkedHashMap<String, Object> hashMap = new LinkedHashMap<String, Object>();
        hashMap.put("val" + i, "val" + i);
        stringObject.add(hashMap);
    }
    /** stringObject is a List containing ordered map */

    /** Here I'm trying to create a JSONArray */

    JSONArray jsonArray = new JSONArray(stringObject);

    System.out.println(jsonArray);
}
}
/****************输出*************/
[{“val0”:“val0”},{“val1”:“val1”},{“val2”},{“val3”:“val3”},{“val4”:“val4”},{“val5”:“val5”},{“val6”:“val6”},{“val7”:“val7”},{“val8”:“val8”},{“val9”:“val9”}]
/********************************/
/**************代码****************/
导入java.util.ArrayList;
导入java.util.LinkedHashMap;
导入java.util.List;
导入org.json.JSONArray;
公共类TestOrderArrayList{
公共静态void main(字符串[]args){
List stringObject=new ArrayList();
对于(int i=0;i<10;i++){
LinkedHashMap hashMap=新LinkedHashMap();
hashMap.put(“val”+i,“val”+i);
添加(hashMap);
}
/**stringObject是包含有序映射的列表*/
/**这里我试图创建一个JSONArray*/
JSONArray JSONArray=新的JSONArray(stringObject);
System.out.println(jsonArray);
}
}
如果你还有别的话要说。请详细说明一下


希望这能解决您的问题。

从您的问题中,我认为您没有得到与输出顺序相同的插入顺序。 我只是仔细检查了一下,发现你错了。我已经做了下面的事情并得到了下面的输出

/*******************output*************/



[{"val0":"val0"},{"val1":"val1"},{"val2":"val2"},{"val3":"val3"},{"val4":"val4"},{"val5":"val5"},{"val6":"val6"},{"val7":"val7"},{"val8":"val8"},{"val9":"val9"}]

/********************************/

 /************** Code****************/

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

import org.json.JSONArray;

public class TestOrderArrayList {

public static void main(String[] args) {
    List<LinkedHashMap<String, Object>> stringObject = new ArrayList<LinkedHashMap<String, Object>>();

    for (int i = 0; i < 10; i++) {
        LinkedHashMap<String, Object> hashMap = new LinkedHashMap<String, Object>();
        hashMap.put("val" + i, "val" + i);
        stringObject.add(hashMap);
    }
    /** stringObject is a List containing ordered map */

    /** Here I'm trying to create a JSONArray */

    JSONArray jsonArray = new JSONArray(stringObject);

    System.out.println(jsonArray);
}
}
/****************输出*************/
[{“val0”:“val0”},{“val1”:“val1”},{“val2”},{“val3”:“val3”},{“val4”:“val4”},{“val5”:“val5”},{“val6”:“val6”},{“val7”:“val7”},{“val8”:“val8”},{“val9”:“val9”}]
/********************************/
/**************代码****************/
导入java.util.ArrayList;
导入java.util.LinkedHashMap;
导入java.util.List;
导入org.json.JSONArray;
公共类TestOrderArrayList{
公共静态void main(字符串[]args){
List stringObject=new ArrayList();
对于(int i=0;i<10;i++){
LinkedHashMap hashMap=新LinkedHashMap();
hashMap.put(“val”+i,“val”+i);
添加(hashMap);
}
/**stringObject是包含有序映射的列表*/
/**这里我试图创建一个JSONArray*/
JSONArray JSONArray=新的JSONArray(stringObject);
System.out.println(jsonArray);
}
}
如果你还有别的话要说。请详细说明一下


希望这能解决你的疑问。

你找错地方了。列表的元素保持顺序(
list
JSONArray
保持顺序)

但是您可以将映射添加到
JSONArray
。每个单独地图中项的转换似乎失去了顺序。您可以通过将单个映射转换为
JSONObject
来检查这一点

为了回答如何保持这种顺序,我需要知道您使用的是哪个JSON框架

编辑您使用的是默认的json.org Java框架。正如文件明确指出的那样:

JSONObject是名称/值对的无序集合

因此,用这个框架是无法做到这一点的

我检查了jackson,但找不到任何迹象表明它保留了映射元素的排序顺序


我猜这是因为JavaScript不支持这一点。

你找错地方了。列表的元素保持顺序(
list
JSONArray
保持顺序)

但是您可以将映射添加到
JSONArray
。每个单独地图中项的转换似乎失去了顺序。您可以通过将单个映射转换为
JSONObject
来检查这一点

为了回答如何保持这种顺序,我需要知道您使用的是哪个JSON框架

编辑您使用的是默认的json.org Java框架。正如文件明确指出的那样:

JSONObject是名称/值对的无序集合

因此,用这个框架是无法做到这一点的

我检查了jackson,但找不到任何迹象表明它保留了映射元素的排序顺序


我猜这是因为JavaScript不支持这一点。

让我们看看下面的代码,了解到底发生了什么

JSONObject jsonObject=new JSONObject();
 for(LinkedHashMap<String,Object> map:stringObject){

jsonObject.putAll(map);
System.out.println(jsonObject);
} 
在这里,它只是将该键值放在自己的映射中,该映射最终基本上是一个hashmap。
正如您所知,哈希映射不是有序的。这就是为什么当你看它的输出时,它基本上与你插入的顺序不符。

让我们看看你下面的代码,了解到底发生了什么

JSONObject jsonObject=new JSONObject();
 for(LinkedHashMap<String,Object> map:stringObject){

jsonObject.putAll(map);
System.out.println(jsonObject);
} 
在这里,它只是将该键值放在自己的映射中,该映射最终基本上是一个hashmap。
正如您所知,哈希映射不是有序的。这就是为什么当你看它的输出时,它基本上不是你插入的顺序。

根据你指定的值
public JSONObject putAll(Map<String, Object> newProperties)
{
    assert newProperties != null;

    for (Map.Entry<String, Object> e : newProperties.entrySet())
    {
        this.put(e.getKey(), e.getValue());
    }

    return this;
}
public JSONObject put(String key, Object value) throws JSONException {
    if (key == null) {
        throw new NullPointerException("Null key.");
    }
    if (value != null) {
        testValidity(value);
        this.map.put(key, value);
    } else {
        this.remove(key);
    }
    return this;
}