Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:Json字符串,带有指向对象的ANSI转义代码_Java_Gson - Fatal编程技术网

Java:Json字符串,带有指向对象的ANSI转义代码

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

我有下面的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\"}";
字符串
是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));