Преобразовать строку (содержащую escape-символы, символы новой строки) в обычную строку

#java #json #string

#java #json #строка

Вопрос:

У меня есть строка :

 String str = "[{\n            \"country_group\": [\"Asia\"],\n            \"country\": [\n                \"IND\" , \"China\"\n            ]\n        },\n        {\n            \"country_group\": [\"NAmerica\"],\n            \"country\": [\n                \"US\"\n            ]\n        }]";
  

В Sysout это дает мне :

 [{n            "country_group": ["Asia"],n            "country": [n                "IND" , "China"n            ]n        },n        {n            "country_group": ["NAmerica"],n            "country": [n                "US"n            ]n        }]
  

Я хочу преобразовать ее в обычную строку, которая в sysout даст мне вывод ниже :

 [{
            "country_group": ["Asia"],
            "country": [
                "IND" , "China"
            ]
        },
        {
            "country_group": ["NAmerica"],
            "country": [
                "US"
            ]
        }]
  

Моя конечная цель — преобразовать ее в JSONObject. Если я получу этот приведенный выше вывод, я смогу это сделать.

Редактировать: я ищу функцию, которая напрямую преобразует это. без использования каких-либо регулярных выражений.

Комментарии:

1. Для этого сообщества обидно иметь таких некомпетентных участников .. будучи новичком, я чувствую, что мог бы провести некоторое исследование и смогу получить ответ, но здесь люди с гораздо большим опытом также не могут ответить на него. действительно грустно это видеть.

Ответ №1:

во-первых, я хотел бы обратиться к вашему собственному комментарию. Я думаю, что это неуместно, тем более, что вы, вероятно, могли бы найти много контента для данной проблемы, и, пожалуйста, дайте сообществу время увидеть ваш вопрос и ответить на него.

Что касается данной проблемы, как вы уже заметили, вы имеете дело с вводом JSON. Когда имеешь дело с чем-то подобным, лучше всего использовать стороннюю библиотеку, чтобы о вас позаботились и вы сэкономили на этом много времени.

Моя рекомендация в этой ситуации — использовать библиотеки Gson или JSONOrg. Теперь это библиотеки для чтения JSON как «обычной» строки, так что вы можете играть с ней, изменять ее или делать все, что вам нравится. Но мы сталкиваемся с другой проблемой, она заключается в том, что мы должны «отменить экранирование» строки. К счастью, это также решаемо с помощью библиотеки, в данном случае Apache commons. Таким образом, код для «отмены экранирования» строки будет выглядеть следующим образом.

 StringEscapeUtils.unescapeJson(str)
  

Теперь, когда мы с этим разобрались, мы можем обработать JSON, если пожелаем.

 public class TestClass {

public String convertWithGson(String jsonInput) {
    GsonBuilder gsonBuilder;
    Gson gson;

    gsonBuilder = new GsonBuilder();
    gsonBuilder.setPrettyPrinting();
    gson = gsonBuilder.create();

    CountryTest[] countryTest = gson.fromJson(jsonInput, CountryTest[].class);
    /*
    Do with the object what you like
     */
    return gson.toJson(countryTest);
}

public String convertWithJSONOrg(String jsonInput) {
    JSONTokener jsonTokener = new JSONTokener(jsonInput);
    JSONArray jsonArray = new JSONArray(jsonTokener);

    return jsonArray.toString(2);
}

}
  

Gson больше подходит, если вы хотите легко сопоставлять объекты и манипулировать ими с помощью Java.
Класс CountryTest:

 public class CountryTest {

private List<String> country_group;
private List<String> country;
}
  

Со всеми получателями и установщиками, конечно.

Запуск будет выглядеть так:

 public static void main(String[] args) {
    TestClass testClass = new TestClass();

    String str = "[{\n            \"country_group\": [\"Asia\"],\n            \"country\": [\n                \"IND\" , \"China\"\n            ]\n        },\n        {\n            \"country_group\": [\"NAmerica\"],\n            \"country\": [\n                \"US\"\n            ]\n        }]";
    System.out.println(testClass.convertWithGson(StringEscapeUtils.unescapeJson(str)));
    System.out.println("-----------");
    System.out.println(testClass.convertWithJSONOrg(StringEscapeUtils.unescapeJson(str)));
}
  

С выводом:

 [
  {
    "country_group": [
      "Asia"
    ],
    "country": [
      "IND",
      "China"
    ]
  },
  {
    "country_group": [
      "NAmerica"
    ],
    "country": [
      "US"
    ]
  }
]
-----------
[
  {
    "country": [
      "IND",
      "China"
    ],
    "country_group": ["Asia"]
  },
  {
    "country": ["US"],
    "country_group": ["NAmerica"]
  }
]

Process finished with exit code 0
  

Я надеюсь, что я был полезен, и, пожалуйста, не торопитесь, программирование — это очень весело, но не то, что мы хотим торопить. Это всегда возвращается к нам.