comを使用します.alibaba.fastjsonはjsonをcsvに変換し、ヘッダーの順序を指定します./解決する.json変換csv順序が変わった
26599 ワード
引用:
fastjsonは現在、
1.ヘッダーで指定された順序が変わります.
私の
名前は前にあります
これは,
しかし、ソースコードを変更するのは不便で、自分で梱包して使う必要があります.なぜ
2.プロジェクトではfastjsonを使い、2つで混乱しやすい
前の手順で説明したようにソースコードを変更しても、同じプロジェクトで2つのjsonパッケージが使用され、特にメンテナンスや参照で間違えやすい.また、
解決:
次のコードは、使用例です.
ConcertCsv.JAvaツールクラス
配列を得る方法はいろいろありますが、ここでは一つ一つ紹介しません.タイプが統一されている場合はclassとして定義してjsonを変換し、順序を指定することができますが、こちらは表頭が不確定です.
fastjsonは現在、
json
をcsv
に変換することをサポートしていないことを知っています.ネット上の多くはorg.json
のCDL.toString
でjson
配列をcsv
に変換していますが、私には2つの問題があります.1.ヘッダーで指定された順序が変わります.
私の
json
配列:[{"name":"LiMing","age":"28","gender":"man"},{"name":"LiPing","age":"26","gender":"women"}]
私がCDL.toString
の結果を使って得たのは:gender,name,age
women,LiPing,26
man,LiMing,28
名前は前にあります
name,age,gender
LiMing,28,man
LiPing,26,women
これは,
CDL.toString
が伝達されたjson配列中のJSONObjectに基づいて処理され,org.json
のJSONObject
がa-z
の順に並べ替えられると,問題は,org.json
のJSONObject
をどのように秩序化させるかということであり,彼の構造方法ではデフォルトではHashMap
であり,それをLinkedHashMap
に変更すれば秩序を保つことができることが分かるからである. public JSONObject() {
this.map = new LinkedHashMap();
}
しかし、ソースコードを変更するのは不便で、自分で梱包して使う必要があります.なぜ
org.json
が自分でorderJSONObject
を出さないのか分かりません.2.プロジェクトではfastjsonを使い、2つで混乱しやすい
前の手順で説明したようにソースコードを変更しても、同じプロジェクトで2つのjsonパッケージが使用され、特にメンテナンスや参照で間違えやすい.また、
fastjson
は、JSONObject
よりも規則的なorg.json
を指定することをサポートしているが、fastjson
はcsv
への変換をサポートしていないので、com.alibaba.fastjson.JSONArray
をcsv
に変換する方法を書くには、主にorg.json
のCDL.java
を参照してください.解決:
次のコードは、使用例です.
JSONArray array = new JSONArray();
JSONObject object2 = new JSONObject(new LinkedHashMap<>()); // LinkedHashMap
object2.put("name","LiMing");
object2.put("age","28");
object2.put("gender","man");
JSONObject object = new JSONObject(new LinkedHashMap<>());
object.put("name","LiPing");
object.put("age","26");
object.put("gender","women");
array.add(object);
array.add(object2);
String s = ConvertCsv.toString(array);
FileUtils.writeStringToFile(new File("E:\\hello.csv"), s);
ConcertCsv.JAvaツールクラス
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Set;
public class ConvertCsv {
public ConvertCsv() {
}
public static String toString(JSONArray ja) {
JSONObject jo = ja.getJSONObject(0);
if (jo != null) {
Set<String> strings = jo.keySet();
JSONArray names = JSONArray.parseArray(JSON.toJSONString(strings));
if (names != null) {
return rowToString(names) + toString(names, ja);
}
}
return null;
}
public static String rowToString(JSONArray jsonArray) {
StringBuilder sb = new StringBuilder();
for(int i = 0; i < jsonArray.size() ; ++i) {
if (i > 0) {
sb.append(',');
}
Object object = jsonArray.get(i);
if (object != null) {
String string = object.toString();
if (string.length() > 0 && (string.indexOf(44) >= 0 || string.indexOf(10) >= 0 || string.indexOf(13) >= 0 || string.indexOf(0) >= 0 || string.charAt(0) == '"')) {
sb.append('"');
int length = string.length();
for(int j = 0; j < length; ++j) {
char c = string.charAt(j);
if (c >= ' ' && c != '"') {
sb.append(c);
}
}
sb.append('"');
} else {
sb.append(string);
}
}
}
sb.append('
');
return sb.toString();
}
public static String toString(JSONArray names, JSONArray ja) {
if (names != null && names.size() != 0) {
StringBuilder sb = new StringBuilder();
for(int i = 0; i < ja.size(); ++i) {
JSONObject jo = ja.getJSONObject(i);
if (jo != null) {
sb.append(rowToString(toJSONArray(jo, names)));
}
}
return sb.toString();
} else {
return null;
}
}
public static JSONArray toJSONArray(JSONObject obj, JSONArray names) {
if (names != null && !names.isEmpty()) {
JSONArray ja = new JSONArray();
for(int i = 0; i < names.size(); ++i) {
ja.add(obj.get(names.getString(i)));
}
return ja;
} else {
return null;
}
}
配列を得る方法はいろいろありますが、ここでは一つ一つ紹介しません.タイプが統一されている場合はclassとして定義してjsonを変換し、順序を指定することができますが、こちらは表頭が不確定です.