2

次のような文字列があります。

[ { "1":33 }, { "2":30 }, { "3":15 }, { "4":23 }, ...{ "9":17 },... { "U":2 }, { "V":22 }, { "W":1 }, { "X":35 }, { "Y":6 }, { "Z":19 } ]

構造は{"key":value}. キーに基づいて値をフェッチできるように、これをテーブル/HashMap に変換する必要があります。

Gson を使用しようとしましたが、失敗しました。シリアライゼーションを使用するような、より簡単な方法はありますか?

ティア

4

5 に答える 5

7

私が作ったこの方法を使用してください:

public HashMap<String, Integer> convertToHashMap(String jsonString) {
        HashMap<String, Integer> myHashMap = new HashMap<String, Integer>();
        try {
            JSONArray jArray = new JSONArray(jsonString);
            JSONObject jObject = null;
            String keyString=null;
            for (int i = 0; i < jArray.length(); i++) {
                jObject = jArray.getJSONObject(i);
                // beacuse you have only one key-value pair in each object so I have used index 0 
                keyString = (String)jObject.names().get(0);
                myHashMap.put(keyString, jObject.getInt(keyString));
            }
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return myHashMap;
    }

使用する:

String myString = "[ { \"1\":33 }, { \"2\":30 }, { \"3\":15 }, { \"4\":23 }, { \"9\":17 }, { \"U\":2 }, { \"V\":22 }, { \"W\":1 }, { \"X\":35 }, { \"Y\":6 }, { \"Z\":19 } ]";
HashMap<String, Integer> map = convertToHashMap(myString);
Log.d("test", map.toString());

を使用してすべてのキーを取得することもできますmap.keySet()

于 2013-02-22T05:26:43.280 に答える
1
public static void main(String[] args) {
    String s = "{ 1:33 }, { 2:30 }, { 3:15 }, { 4:23 }, { 9:17 }, { U:2 }, { V:22 }, { W:1 }, { X:35 }, { Y:6 }, { Z:19 }";
    String[] arr = s.split(", ");
    Map<String, Integer> map = new HashMap<String, Integer>();
    for (String str : arr) {
        str = str.replace("{", "").replace("}", "");
        String[] splited = str.split(":");

        map.put(splited[0], Integer.parseInt(splited[1].trim()));

    }
    System.out.println(map);

}

出力:

{ 9=17,  Z=19,  Y=6,  X=35,  1=33,  3=15,  2=30,  W=1,  V=22,  4=23,  U=2}
于 2013-02-22T06:28:56.567 に答える
0

オブジェクトの配列があり、それぞれが異なります(フィールドが異なります)。JSONパーサーは、オブジェクトへの逆シリアル化について話しているときに問題が発生します。Gsonユーザーガイドでは、これについて具体的に言及しています

Gsonを使用することはできますが、Gsonが提案する方法の1つを使用する必要があります。を返すカスタムデシリアライザーを作成するのMapはかなり簡単です。配列を調べ、各オブジェクトを取得してから、フィールドと値を抽出する必要があります。

// create this class so as not to affect other Map types:
class MyMap extends HashMap<String, Integer> {}

class MyMapDeserializer implements JsonDeserializer<MyMap> 
{
    public MyMap deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) 
          throws JsonParseException 
    {
        JsonArray ja = je.getAsJsonArray();
        MyMap map = new MyMap();
        for (int i = 0; i < ja.size(); i++) 
        {
            JsonObject jo = ja.get(i).getAsJsonObject();
            Set<Entry<String, JsonElement>> set = jo.entrySet();
            for (Entry<String, JsonElement> e : set) 
            {
                map.put(e.getKey(), e.getValue().getAsInt());
            }
        }
        return map;
    }
}

あなたはそれを介して使用します:

Gson gson = new GsonBuilder()
                .registerTypeAdapter(MyMap.class, new MyMapDeserializer())
                .create();

MyMap mm = gson.fromJson(jsonString, MyMap.class);
于 2013-02-22T05:27:20.200 に答える
0

このコードは、正規表現を使用して使用できます。

    Map<String, String> map = new HashMap<String, String>();
    //!!Your string comes here, I escape double quoutes manually !!
    String str = "\"[ { \"1\":33 }, { \"2\":30 }, { \"3\":15 }, { \"4\":23 }, { \"9\":17 }, {\"U\":2 }, { \"V\":22 }, { \"W\":1 }, { \"X\":35 }, { \"Y\":6 }, { \"Z\":19 } ]\"";
    String regex = "\\{\\s*\"(\\w+)\":(\\d+)\\s*\\}";


    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(str);

    while (matcher.find()) {
        String key = matcher.group(1);
        String value = matcher.group(2);
        System.out.println(key + " " + value);
        map.put(key, value);
    }

プリント:

1 33
2 30
3 15
4 23
9 17
U 2
V 22
W 1
X 35
Y 6
Z 19

注:必要に応じてMap<String,Integer>、定義を変更し、を使用Integer.parseInt()して文字列から整数を取得します。

于 2013-02-22T05:28:01.667 に答える
0

独自の単純なパーサーを作成します。各文字を最初から読み始めます。「」が表示されたら、次の文字の開始をキーの開始として扱い始め、次の文字が発生したら、この時点でキーを取得します: を探し、空白が表示されるまで値を記録しますまたは}。文字列内のすべての文字を読み取るまで、このプロセスを繰り返します。このように、n 個の文字がある場合、O(n) で解決されます。

于 2013-02-22T05:12:55.803 に答える