Java : Json 带有 ANSI 转义码的字符串到对象

Java : Json String with ANSI escape code to Object

我在 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 对象? Class/Type 应该是什么?我被卡住了,因为它有 ANSI 颜色代码 """ 符号。

试试这个

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

问题是您正在尝试将 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));