如何在一行中初始化HashMaps列表列表?

时间:2014-10-30 18:25:21

标签: java json collections gson

我需要创建一个对象,其中包含[[{IMEI = 49015420323751]],[{PIN = 538000001}]]等值,以便将其转换为JSON。

现在我正在做的是

        ArrayList<ArrayList<HashMap<String,String>>> Request_Identifiers = new ArrayList<ArrayList<HashMap<String,String>>>();
        ArrayList<HashMap<String,String>> list1 = new ArrayList<HashMap<String,String>>();
        HashMap<String,String> map1 = new HashMap<String,String>();
        map1.put("IMEI","49015420323751");
        list1.add(map1);
        ArrayList<HashMap<String,String>> list2 = new ArrayList<HashMap<String,String>>();
        HashMap<String,String> map2 = new HashMap<String,String>();
        map2.put("PIN","538000001");
        list2.add(map2);

        Request_Identifiers.add(list1);    
        Request_Identifiers.add(list2);

但是我现在需要在Constructor中完成它(比如我如何初始化字符串数组new String [] {“blocked”,“suspended”,“classmask”})或者为此编写一个setter方法。怎么做 ?我真的很困惑。如果有人能帮助我,我会很高兴。

提前致谢。

编辑:

我需要在java中创建一个JSON对象,以便在java中传递一个类似

的请求
        {
            "attributes": ["blocked", "suspended"],
            "authPolicy":  ["device_valid"],
            "identity":  "first_id",
            "encoding": "default",
            "identifiers":
            [
                [
                    {"PIN": "234576"},
                    {"IMEI": "49015420323751"}
                ],
                [
                    {"PIN": "68000001"}
                ]
            ]
        }

所以我正在编写一个java类,并计划使用gson

转换为json格式
        class RequestBody
        {
            String[] Request_Attributes;
            String[] Request_Policies;
            String Request_Identity;
            String Request_Encoding;        
            Boolean Auth_Client;
            Boolean Handle_429;
            ArrayList<ArrayList<HashMap<String,String>>> Request_Identifiers;
            public RequestBody()
            {
                Request_Attributes = new String[]{"blocked","suspended","classmask"};
                Request_Policies =  new String[]{"bbm_meetings"};
                Request_Identity = "first_id";
                Request_Encoding = "default";       
                Auth_Client = true;
                Handle_429 = true;
            }
        }



        //System.out.println(RequestBody.Request_Identity);
        Gson gson = new Gson();
        System.out.println(gson.toJson(new RequestBody()));

我不知道这是否会起作用,但这就是解决问题的方法。

对不起,如果这看起来太简陋了,我是编程的初学者。

2 个答案:

答案 0 :(得分:5)

如果目标只是将其全部划分为几行,则可以使用double brace / instance initialization

// Could be one line, but formatted for (some) readability
ArrayList<ArrayList<HashMap<String,String>>> Request_Identifiers = new ArrayList<ArrayList<HashMap<String,String>>>{
    {
      add(new ArrayList<HashMap<String,String>{{ add( new HashMap<String,String>{{ put("IMEI","49015420323751"); }}; ); }});
      add(new ArrayList<HashMap<String,String>{{ add( new HashMap<String,String>{{ put("PIN","538000001"); }}; ); }});
    }
};

这显然不是非常易读或可维护。如果您想提供一种更简单的方式来访问您的数据,遵循良好的OO设计模式并创建映射到您的模型的POJO数据对象,这将是一种更好的方法。

// handle your arrays/maps internally as part of the constructor
RequestIdentifiers requestIdentifiers = new RequestIdentifiers( "49015420323751", "538000001" ); 

答案 1 :(得分:1)

您无法对要创建的列表执行此操作..您必须使用方法add将值插入列表中。列表不能像匿名数组一样创建。

尽管如此,你可以使用Arrays.asList(T...),但在你的情况下不太合适,尽管你可以创建这样的列表

Arrays.asList(Arrays.asList(T...),Arrays.asList(T...),Arrays.asList(T...))

在一天结束时,你必须创建一个你不能这样做的地图。