【问题标题】:String to map conversion java字符串到映射转换java
【发布时间】:2017-01-16 09:47:23
【问题描述】:

代码:

 Map test = new HashMap<String,String>();
 test.put("1", "erica");
 test.put("2", "frog");
 System.out.println(test.toString());

这段代码给出的输出为:

 {1=erica, 2=frog}

我希望再次将此输出作为键值对放入映射中。 有什么建议我该如何实施? 或者是否有任何预定义的实用程序类可以再次将输出转换为HashMap

【问题讨论】:

  • 没有标准实用程序可以将Map 的字符串表示形式反序列化回Map 对象,因此您必须自己构建一个。问题是,您为什么需要这样做(而不是序列化为 JSON 或 XML)?
  • toString 输出可以改变,你不应该依赖它。
  • 同意 - 考虑序列化到/从 JSON 或类似的东西 - 只需使用 Jackson ObjectMapper 即可为您完成大部分工作。

标签: java string hashmap


【解决方案1】:

对我来说,正确的方法是使用 JSONJackson 这样的解析器,因为 HashMap 的序列化方式并不意味着在之后解析,如果你使用特定的字符,比如 = 或 @ 987654326@ 他们不会被转义,这使得它无法解析。

如何用Jackson序列化Map

ObjectMapper mapper = new ObjectMapper();
String result = mapper.writeValueAsString(myMap);

如何反序列化 String 以获取带有 JacksonMap

ObjectMapper mapper = new ObjectMapper();
Map map = mapper.readValue(contentToParse, Map.class);

【讨论】:

    【解决方案2】:

    你可以试试这个:

    String[] tk = mystring.split(" |=");
    Map<String, String> map = new HashMap<>();
    for (int i=0; i < tk.length-1; i++)
    { 
      map.put(tk[i], tk[i]);
    }
    return map;
    

    【讨论】:

      【解决方案3】:

      如果您想复制填充地图的 Java 代码,您可以使用如下代码:

      StringBuilder sb = new StringBuilder("Map<String, String> test = new HashMap<>();");
      for(Map.Entry<?, ?> entry : test.entrySet())
      {
          sb.append("\ntest.put(\"");
          sb.append(entry.getKey());
          sb.append("\", \"");
          sb.append(entry.getValue());
          sb.append("\");");
      }
      String string = sb.toString();
      System.out.println(string);
      

      但我同意 cmets 的观点,即在许多应用程序中,JSON 等格式更适合序列化地图。

      请注意,上述解决方案不会转义字符串,它仅适用于字符串不包含 " 或 \n 等字符的情况。如果您需要处理这些情况,它会变得更加复杂。

      【讨论】:

        【解决方案4】:

        您可以尝试以下方法:

        String out = test.toString();
        Map<String, String> newMap = new HashMap();
        // remove the first and last "{", "}"
        out = out.subString(1,out.size()-1)
        String[] newOut = out.split(", ");
        for (int i=0; i<newOut.length;i++){
            // keyValue is size of 2. cell 0 is key, cell 1 is value
            String[] keyValue = newOut.split("=");
            newMap.put(keyValue[0], keyValue[1]);
        }
        

        我还没有测试我刚刚从脑海中写下的java代码。我希望它会工作

        【讨论】:

          猜你喜欢
          • 2014-05-26
          • 2018-03-10
          • 2016-10-20
          • 2020-10-09
          • 1970-01-01
          • 1970-01-01
          • 2013-11-20
          • 2011-02-19
          • 1970-01-01
          相关资源
          最近更新 更多