web-dev-qa-db-ja.com

LinkedHashMapからの順序付けされたJSON文字列の構築

キー/値のペアを挿入順に並べる必要があったため、LinkedHashMapではなくHashMapを使用することにしました。しかし、LinkedHashMapをJSON文字列に変換する必要があります。この場合、LinkedHashMapの順序は文字列で維持されます。

しかし、現在私はそれを達成しています:

  1. 最初にLinkedHashMapをJSONに変換します。
  2. 次に、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文字列をどのように生成しますか?

10
Karthic Rao

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>

Gradle

compile 'com.google.code.gson:gson:2.8.5'

または、 Maven Central にアクセスして、その他のダウンロードオプションを確認することもできます。

13
Mr. Polywhirl

JSONObjectは、org.jsonライブラリの使用を意味します。それをしないでください。それは古いプロトタイプであり、ジャクソンやGSONのようなより良いオプションがあります。ジャクソンでは、次のように使用します。

String json = new ObjectMapper().writeValueAsString(myLinkedHashMap);

そして、マップが使用するあらゆるトラバーサル順序のエントリを含むJSON文字列を取得します。

4
StaxMan

アルファベット順にソートするには、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();
}
0
mtyurt

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());
0
Subbu

私も同じ問題に遭遇しました。この特定のライブラリを使用する必要があり、最初の要素はキー "$ 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メソッドをオーバーライドしています