Java 保持列表<;LinkedHashMap<;字符串,对象>&燃气轮机;与JSONArray对话时的顺序
我看过所有关于在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
时,我丢失了订单,我必须保留它
我尝试了所有的解决方案,但没有一个对我有效
我使用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;
}