2016-12-30 3 views
0

Я использую Gson для разбора JSON строки, как это одна:Вызванный: java.lang.IllegalStateException: Ожидаемая строка, но был BEGIN_OBJECT

{"showapi_res_code": 0, 
    "showapi_res_error": "1", 
    "showapi_res_body": { 
    "totalNum": 44, 
    "ret_code": 0 
    } 
} 

Когда я использую следующий код все работает отлично:

Bean bean = gson.fromJson(stringFromSource, Bean.class); 

public class Bean{ 
    int showapi_res_code; 
    String showapi_res_error; 
    Body showapi_res_body; 

    public static class Body{ 
     int totalNum; 
     int ret_code; 
    } 
} 

Но когда я использую следующий код вещи не совсем работа:

Bean1 bean1 = gson.fromJson(stringFromSource, Bean1.class); 

public class Bean1 { 
    int showapi_res_code; 
    String showapi_res_error; 
    String showapi_res_body; 
} 

Я получаю это исключение:

Вызванный: java.lang.IllegalStateException: Ожидаемая строка, но была BEGIN_OBJECT в строке 3 столбца 24 пути $ .showapi_res_body

Как я могу сделать эту работу с помощью Gson?

+2

Возможный дубликат [GSON: Ожидаемая строка, но была НАЧАТЬ \ _OBJECT] (http://stackoverflow.com/questions/11571412/gson-expected-a-string-but-was-begin-object) –

+0

спасибо, я пришел посмотреть – xujun

ответ

1

Добавить отдельный класс не внутренний класс

public class Bean{ 
    int showapi_res_code; 
    String showapi_res_error; 
    Body showapi_res_body; 
} 

public class Body{ 
     int totalNum; 
     int ret_code; 
    } 

Или

public class Bean{ 
     int showapi_res_code; 
String showapi_res_error; 
HashMap<String,Integer> showapi_res_body; 

public int getShowapi_res_code() { 
    return showapi_res_code; 
} 

public void setShowapi_res_code(int showapi_res_code) { 
    this.showapi_res_code = showapi_res_code; 
} 

public String getShowapi_res_error() { 
    return showapi_res_error; 
} 

public void setShowapi_res_error(String showapi_res_error) { 
    this.showapi_res_error = showapi_res_error; 
} 

public HashMap<String, Integer> getShowapi_res_body() { 
    return showapi_res_body; 
} 

public void setShowapi_res_body(HashMap<String, Integer> showapi_res_body) { 
    this.showapi_res_body = showapi_res_body; 
} 
} 

Чтобы получить подробную

Bean bean1 = gson.fromJson(stringFromSource, Bean1.class); 
int totalNum = (Integer)bean1.getShowapi_res_body().get("totalNum"); 
int ret_code= (Integer)bean1.getShowapi_res_body().get("ret_code"); 
+0

Следуйте вашему предложению, HashMap stringMap = map.showapi_res_body; Строка string = stringMap.get ("showapi_res_body"); , но результат, как это, > [Ljava.lang.String; @ 1de0aca6 не строки, как я должен получить stirng > { "totalNum": 44, "ret_code" : 0 } – xujun

+0

ОК, я приезжаю посмотреть – xujun

+0

Следуйте вашему предложению, 'HashMap stringMap = map.showapi_res_body; String String = stringMap.get ("showapi_res_body"); ' но результат, как это, ' [Ljava.lang.Строка; @ 1de0aca6' а не строки, как я должен получить stirng '{ "totalNum": 44, " ret_code": 0 }' – xujun

0

showapi_res_body не является значением String. В предыдущем примере вы используете объект Body, я предлагаю вам использовать его. Если вы хотите вывести String, попробуйте сделать это вручную нравится:

public static class Body { 

    int totalNum; 
    int ret_code; 

    @Override 
    public String toString() { 
     return "totalNum = " + totalNum + ", ret_code = " + ret_code; 
    } 
} 

Тогда вы можете позвонить:

String output = bean1.showapi_res_body.toString(); 
+0

Терлинген, если я так использую, результат строки не json. У вас есть лучший способ? – xujun

0

Ну, я думаю, что это очевидно, если вы хотите быть String, ваш JSON должно иметь поле как тип String.

{"showapi_res_code": 0, 
    "showapi_res_error": "1", 
    "showapi_res_body": "{ \"totalNum\": 44, \"ret_code\": 0}" 
} 
+0

ответ вы в порядке, спасибо – xujun

Смежные вопросы