2015-08-10 3 views
2

Я преобразовал строковый массив в строку с использованием Arrays.toString(variable) и сохранил его в сеансе. Теперь я хочу преобразовать его в массив строк. Как мне это сделать?Преобразование массива String в строку обратно в строковый массив

Я надеялся, если есть способ сделать это более простым способом, например, разобрать его на строковый массив.

Вот пример строки. Он разделяется запятой.

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

Update:
Я посоветовал не использовать toString сериализовать массив. Но поскольку я имею дело с простым массивом, я все же решил использовать его.

+2

'toString' не следует использовать для сериализации/десериализации. Найдите лучший инструмент (например, JSON). –

+1

Почему вы не сохраняете массив непосредственно в сеансе? – Pshemo

+0

@Pshemo im new для java, поэтому все, что я знаю, это то, что я могу сохранить только строку, int и boolean для сеанса. Я не пытался сохранить массив. – user3360031

ответ

3

Если отдельные строки могут включать запятую, а затем пробел, то это было бы невозможно. Массивы с несколькими строками [] могут отображаться в одной и той же плоской строке, а обратная функция не существует.

Однако вы отметите в комментарии, что ваши строки не могут включать разделитель запятой. Вы можете разбить плоскую строку обратно на исходные подстроки, используя «,» (запятая, пробел) в качестве разделителя.

API, поддерживающие этот стандарт, включают стандартный метод Java String.split() и класс Guava Splitter.

Вот пример с split() метода в Java:

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); 
    } 

} 

А вот пример с 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); 
    } 
} 
+0

Я бы использовал Base64 для кодирования и декодирования строк, чтобы избежать каких-либо проблем. –

1

Я думаю, 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

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – fabian

+0

ладно, понял. Я улучшил свой ответ. – solar

+0

Благодарим вас за улучшение вашего ответа. – JAL

0

Простейшее решение (при условии, что речь идет о Java EE-х HttpSession) будет не помещая String, представляющий массив, но массив сам по setAttribute(String name, Object value), так, как вы видите value может быть любым Object, а не только String.

DEMO, используя List<String> вместо String[] (не может быть совершенными, но должны получить идею):

@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>" 
     ); 
    } 

} 
-1

Если вы всегда хотите операцию строки с этим любопытным ужалить 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 для обработки ответа/запроса.