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));
我在 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));