Java:Json字符串,带有指向对象的ANSI转义代码
我有下面的Java字符串Java:Json字符串,带有指向对象的ANSI转义代码,java,gson,Java,Gson,我有下面的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;31mSynt
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\"}";
字符串
是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颜色代码,带有“[”符号。试试这个
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();
}
试试看{
JSONObject对象=新的JSONObject(ansiStr);
TrackBook track=new Gson().fromJson(object.toString(),TrackBook.class);
List trackList=track.getTraceback();
}捕获(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;
}
}
公共类轨迹手册{
@SerializedName(“回溯”)
@暴露
私有列表回溯=null;
@SerializedName(“ename”)
@暴露
私有字符串名称;
@序列化名称(“evalue”)
@暴露
私有字符串求值;
公共列表getTraceback(){
返回回溯;
}
公共无效设置回溯(列表回溯){
this.traceback=回溯;
}
公共字符串getEname(){
返回ename;
}
public void setEname(字符串ename){
this.ename=ename;
}
公共字符串getEvalue(){
返回值;
}
公共void setEvalue(字符串evalue){
this.evalue=evalue;
}
}
试试这个
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();
}
试试看{
JSONObject对象=新的JSONObject(ansiStr);
TrackBook track=new Gson().fromJson(object.toString(),TrackBook.class);
List trackList=track.getTraceback();
}捕获(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;
}
}
公共类轨迹手册{
@SerializedName(“回溯”)
@暴露
私有列表回溯=null;
@SerializedName(“ename”)
@暴露
私有字符串名称;
@序列化名称(“evalue”)
@暴露
私有字符串求值;
公共列表getTraceback(){
返回回溯;
}
公共无效设置回溯(列表回溯){
this.traceback=回溯;
}
公共字符串getEname(){
返回ename;
}
public void setEname(字符串ename){
this.ename=ename;
}
公共字符串getEvalue(){
返回值;
}
公共void setEvalue(字符串evalue){
this.evalue=evalue;
}
}
问题在于,您试图将JSON作为数组列表来读取,但它不是数组,而是对象:
{
"traceback": [...], // this is actually an array
"ename": "Error",
"evalue": "UnExpected"
}
您收到的错误消息提示:预期为BEGIN\u数组,但为BEGIN\u对象
因此,您需要做的就是将其作为地图阅读:
Map map = gson.fromJson(ansiStr, Map.class);
Gson
将自动检测traceback
是一个数组,并为其创建一个列表。您可以这样测试它:
System.out.println(((List) map.get("traceback")).get(0));
问题在于,您试图将JSON读取为ArrayList
,但它不是数组,而是对象:
{
"traceback": [...], // this is actually an array
"ename": "Error",
"evalue": "UnExpected"
}
您收到的错误消息提示:预期为BEGIN\u数组,但为BEGIN\u对象
因此,您需要做的就是将其作为地图阅读:
Map map = gson.fromJson(ansiStr, Map.class);
Gson
将自动检测traceback
是一个数组,并为其创建一个列表。您可以这样测试它:
System.out.println(((List) map.get("traceback")).get(0));