【问题标题】:Convert String array to string back to string array将字符串数组转换回字符串数组
【发布时间】:2015-08-10 15:22:59
【问题描述】:

我使用Arrays.toString(variable) 将字符串数组转换为字符串并将其保存在会话中。现在我想将它转换回字符串数组。我怎么做?

我希望有一种更简单的方法,比如将其解析为字符串数组。

这是字符串的示例。它用逗号分隔。

[Any, Resolved (1), ANS MACH / LEFT MSG (1)]

更新:
有人建议我不要使用toString 来序列化数组。但由于我处理的是简单数组,我还是选择使用它。

【问题讨论】:

  • toString 不应用于序列化/反序列化。寻找更好的工具(例如 JSON)。
  • 为什么不在会话中直接保存数组?
  • @Pshemo 我是 java 新手,所以我只知道我只能将字符串、int 和 boolean 保存到会话中。我还没有尝试保存数组。
  • @AndyThomas 不。这就是我使用 tostring 的原因之一。如果我错了,请纠正我
  • 该约束在问题中值得一提。否则,多个 String[] 数组可能会映射到同一个 String,并且不会有反向函数。

标签: java arrays string


【解决方案1】:

如果单个字符串本身可能包含一个逗号,后跟一个空格,那么这是不可行的。多个 String[] 数组可以映射到同一个平面 String,并且不存在反函数。

但是,您在注释中指出您的字符串不能包含逗号分隔符。您可以将扁平字符串拆分回原始子字符串,使用“,”(逗号,空格)作为分隔符。

支持此功能的 API 包括标准 Java String.split() 方法和 Guava 的 Splitter 类。

以下是 Java 的 split() 方法示例:

public static void main(String[] args) {
    String[] strs = new String[] { "Foo", "Bar", "Baz" };

    String joined = Arrays.toString( strs );

    String joinedMinusBrackets = joined.substring( 1, joined.length() - 1);

    // String.split()
    String[] resplit = joinedMinusBrackets.split( ", "); 

    for ( String s : resplit ) {
        System.out.println( s );
    }

}

下面是 Guava 的 Splitter 类的示例:

public static void main(String[] args) {
    String[] strs = new String[] { "Foo", "Bar", "Baz" };

    String joined = Arrays.toString( strs );

    String joinedMinusBrackets = joined.substring( 1, joined.length() - 1);

    // Guava Splitter class
    List<String> resplitList = Splitter.on( ", " ).splitToList( joinedMinusBrackets );

    for ( String s : resplitList ) {
        System.out.println( s );
    }
}

【讨论】:

  • 我会使用 Base64 对字符串进行编码和解码以避免任何问题。
【解决方案2】:

我猜that's 是您正在寻找的答案。简而言之,它是关于使用带有 apache codecs 的序列化来编码/解码对象。我不想从另一个答案中复制/粘贴,所以我只会给你代码示例,以防有一天链接发生变化。 这里是:

  // serialize
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    new ObjectOutputStream(out).writeObject(yourArray);

 //encode
    String encodeString = new String(Hex.encodeHex(out.toByteArray()));

 // deserialize
    ByteArrayInputStream in = new ByteArrayInputStream(Hex.decodeHex(yourString.toCharArray()));
    String yourArray = Arrays.toString((String[]) new ObjectInputStream(in).readObject());
}
// And then you could use `String#split()` method to convert string to array.

另一种选择是使用类似Gson JSON 库的东西,通过 Gson,您可以将任何 java 对象转换为 json 字符串,然后再将其转换回来。示例代码可能如下所示:

//Put an array (or any other object to gson object
Gson gson = new Gson();
String json = gson.toJson(yourArray);

// Retrieve your object from gson
Gson gson = new Gson();
Array array = gson.fromJson(json, Array.class);

更多详情请看this文章。

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
  • 感谢您改进答案。
【解决方案3】:

最简单的解决方案(假设我们正在谈论 Java EE 的 HttpSession)不会放置 String 表示数组,而是通过 setAttribute(String name, Object value) 放置数组本身,因此您看到 value 可以是任何 Object,而不是只有String

使用List&lt;String&gt; 而不是String[] 的DEMO(可能不完美,但应该明白):

@WebServlet("/SessionDemo")
public class SessionDemo extends HttpServlet {


    @Override
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html");
        response.setCharacterEncoding("utf-8");
        request.setCharacterEncoding("utf-8");

        PrintWriter out = response.getWriter();
        HttpSession session = request.getSession();
        List<String> list = (List<String>) session.getAttribute("list");

        printList(out, list);
        printForm(out);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html");
        response.setCharacterEncoding("utf-8");
        request.setCharacterEncoding("utf-8");

        PrintWriter out = response.getWriter();
        HttpSession session = request.getSession();

        List<String> list = (List<String>) session.getAttribute("list");

        if (list == null){
            list = new ArrayList<>();
            session.setAttribute("list", list);
        }
        list.add(request.getParameter("item"));

        printList(out, list);
        printForm(out);

    }

    private void printList(PrintWriter out, List<String> list) {
        out.println("current items:");
        if (list != null){
            out.println("<ul>");
            for (String item : list){
                out.append("<li>").append(item).println("</li>");
            }
            out.println("</ul>");
        }else{
            out.println("list is empty");
        }
        out.println("<hr/>");
    }

    private void printForm(PrintWriter out){
        out.println(
                "<form action='./SessionDemo' method='post'>"
                + "<input type='text' name='item'/>"
                + "<input type='submit' value='add to list'/>"
                + "</form>"
        );
    }

}

【讨论】:

    【解决方案4】:

    如果你总是想用这种刺痛的字符串操作split() 是你所需要的:

    public static void main(String []args){
        String string = "[Any, Resolved (1), ANS MACH / LEFT MSG (1)]";
        String[] parts = string.split(",");// your string Array
        int i=0;
    
        for(; i< parts.length; i++)
            System.out.println(parts[i]);
     }
    

    如果您的字符串还包含[]。那么你需要.replace()


    使用JSON 进行响应/请求处理的最佳实践。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-27
      • 2013-05-12
      • 2018-03-08
      • 2013-05-05
      • 1970-01-01
      • 2011-06-18
      相关资源
      最近更新 更多