Java: Json String с escape-кодом ANSI для объекта - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть строка ниже в Java,

String ansiStr = "{\"traceback\":[\"\\u001b[1;36m  File \\u001b[1;32m\\\"MyFile\\\"\\u001b[1;36m, line \\u001b[1;32m1\\u001b[0m\\n\\u001b[1;33m    codedata\\u001b[0m\\n\\u001b[1;37m                         ^\\u001b[0m\\n\\u001b[1;31mSyntax\\u001b[0m\\u001b[1;31m:\\u001b[0m EOF\\n\"],\"ename\":\"Error\",\"evalue\":\"UnExpected\"}";

String является ответом от ядра IPython и выглядит как в формате JSon, и я попробовал приведенный ниже код, чтобы проанализировать его как объект,

ArrayList list = gson.fromJson(jsonString, ArrayList.class);

Я получаю следующее исключение:

Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

Как я могу преобразовать эту строку в объект JSon? Каким должен быть класс / тип? Я застрял, так как он имеет цветовые коды ANSI с символом "[" .

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Проблема в том, что вы пытаетесь прочитать свой JSON как ArrayList, но это не массив - это объект:

{
    "traceback": [...], // this is actually an array
    "ename": "Error",
    "evalue": "UnExpected"
}

И сообщение об ошибке, которое вы получаете, намекает на это: Expected BEGIN_ARRAY but was BEGIN_OBJECT.

Так что все, что вам нужно сделать, это прочитать его как Map:

Map map = gson.fromJson(ansiStr, Map.class);

Gson автоматически обнаружит, что traceback является массивом, и создаст Listдля этого. Вы можете проверить это так:

System.out.println(((List) map.get("traceback")).get(0));
1 голос
/ 30 сентября 2019

Попробуйте это

try {
        JSONObject object=new JSONObject(ansiStr);
        TrackBook track = new Gson().fromJson(object.toString(),TrackBook.class);
        List<String> trackList=track.getTraceback();
    } catch (JSONException e) {
        e.printStackTrace();
    }

TrackBook.java

public class TrackBook {
@SerializedName("traceback")
@Expose
private List<String> traceback = null;
@SerializedName("ename")
@Expose
private String ename;
@SerializedName("evalue")
@Expose
private String evalue;

public List<String> getTraceback() {
    return traceback;
}

public void setTraceback(List<String> traceback) {
    this.traceback = traceback;
}

public String getEname() {
    return ename;
}

public void setEname(String ename) {
    this.ename = ename;
}

public String getEvalue() {
    return evalue;
}

public void setEvalue(String evalue) {
    this.evalue = evalue;
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...