キー/値のペアを挿入順に並べる必要があったため、LinkedHashMap
ではなくHashMap
を使用することにしました。しかし、LinkedHashMap
をJSON文字列に変換する必要があります。この場合、LinkedHashMap
の順序は文字列で維持されます。
しかし、現在私はそれを達成しています:
次に、JSONを文字列に変換します。
import Java.util.LinkedHashMap;
import Java.util.Map;
import org.json.JSONObject;
public class cdf {
public static void main(String[] args) {
Map<String,String > myLinkedHashMap = new LinkedHashMap<String, String>();
myLinkedHashMap.put("1","first");
myLinkedHashMap.put("2","second");
myLinkedHashMap.put("3","third");
JSONObject json = new JSONObject(myLinkedHashMap);
System.out.println(json.toString());
}
}
出力は次のとおりです。
{"3":"third","2":"second","1":"first"} .
しかし、私は次のようにキーの挿入順にそれを望みます:
{"1":"first","2":"second","3":"third"}
LinkedHashMap
をJSONに変換すると、順序が失われ(JSONに順序の概念がないことは明らかです)、したがって文字列も順序が狂っています。では、LinkedHashMap
と同じ順序のJSON文字列をどのように生成しますか?
Gson 友達の場合。これにより、順序付けられたマップが順序付けされたJSON文字列に出力されます。
挿入順序を維持したい場合は、LinkedHashMap
を使用します。
Gsonの最新バージョン(2.8.5)を使用しました。この投稿の下部にある次のオプションからダウンロードできます。
import Java.util.*;
import com.google.gson.Gson;
public class OrderedJson {
public static void main(String[] args) {
// Create a new ordered map.
Map<String,String> myLinkedHashMap = new LinkedHashMap<String, String>();
// Add items, in-order, to the map.
myLinkedHashMap.put("1", "first");
myLinkedHashMap.put("2", "second");
myLinkedHashMap.put("3", "third");
// Instantiate a new Gson instance.
Gson gson = new Gson();
// Convert the ordered map into an ordered string.
String json = gson.toJson(myLinkedHashMap, LinkedHashMap.class);
// Print ordered string.
System.out.println(json); // {"1":"first","2":"second","3":"third"}
}
}
アイテムを常に適切な場所に挿入する場合は、代わりにTreeMap
を使用してください。
import Java.util.*;
import com.google.gson.Gson;
public class OrderedJson {
public static void main(String[] args) {
// Create a new ordered map.
Map<String,String> myTreeHashMap = new TreeMap<String, String>();
// Add items, in any order, to the map.
myTreeHashMap.put("3", "third");
myTreeHashMap.put("1", "first");
myTreeHashMap.put("2", "second");
// Instantiate a new Gson instance.
Gson gson = new Gson();
// Convert the ordered map into an ordered string.
String json = gson.toJson(myTreeHashMap, TreeMap.class);
// Print ordered string.
System.out.println(json); // {"1":"first","2":"second","3":"third"}
}
}
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
compile 'com.google.code.gson:gson:2.8.5'
または、 Maven Central にアクセスして、その他のダウンロードオプションを確認することもできます。
JSONObject
は、org.json
ライブラリの使用を意味します。それをしないでください。それは古いプロトタイプであり、ジャクソンやGSONのようなより良いオプションがあります。ジャクソンでは、次のように使用します。
String json = new ObjectMapper().writeValueAsString(myLinkedHashMap);
そして、マップが使用するあらゆるトラバーサル順序のエントリを含むJSON文字列を取得します。
アルファベット順にソートするには、Jackson 2. *を使用した適切な方法を次に示します。
Map<String, String> myLinkedHashMap = new LinkedHashMap<String, String>();
myLinkedHashMap.put("1", "first");
myLinkedHashMap.put("2", "second");
myLinkedHashMap.put("3", "third");
ObjectMapper mapper = new ObjectMapper();
mapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);
try {
System.out.println(mapper.writeValueAsString(myLinkedHashMap));
//prints {"1":"first","2":"second","3":"third"}
} catch (JsonProcessingException e) {
e.printStackTrace();
}
Linkedhashmap paramsが両方とも文字列であるため、JSONは挿入順序を取りません。以下のコードのように最初のパラメーターを整数として変更しても問題ありませんか?
Map<Integer,String > myLinkedHashMap = new LinkedHashMap<>();
myLinkedHashMap.put(1,"first");
myLinkedHashMap.put(2,"second");
myLinkedHashMap.put(3,"third");
System.out.println(myLinkedHashMap);
JSONObject json = new JSONObject(myLinkedHashMap);
System.out.println(json.toString());
私も同じ問題に遭遇しました。この特定のライブラリを使用する必要があり、最初の要素はキー "$ type"である必要があります。ここに私の決定があります:
import org.json.JSONObject;
import Java.util.HashMap;
import Java.util.LinkedHashSet;
import Java.util.Map;
import Java.util.Set;
class TypedJSONObject extends JSONObject {
private static final String KEY = "$type";
@Override
public Set<Map.Entry<String, Object>> entrySet() {
Set<Map.Entry<String, Object>> superSet = super.entrySet();
Set<Map.Entry<String, Object>> returnSet = new LinkedHashSet<>();
HashMap<String, Object> map = new HashMap<>();
for (Map.Entry<String, Object> entry : superSet) {
if (entry.getKey().equals(KEY)) {
map.put(KEY, entry.getValue());
break;
}
}
Set<Map.Entry<String, Object>> entries = map.entrySet();
returnSet.addAll(entries);
returnSet.addAll(superSet);
return returnSet;
}
}
ご覧のように、toStringメソッドで使用されているentrySetメソッドをオーバーライドしています