2015-04-04 2 views
0

Я пытаюсь разобрать строку JSON с помощью POJO с gson, я столкнулся коряга, однако при попытке прочитать следующий JSON массив:Синтаксические несколько типов в массиве JSON с gson

{"translate":"chat.type.text","with":[{"insertion":"woder22","clickEvent":{"action":"suggest_command","value":"/msg woder22 "},"hoverEvent":{"action":"show_entity","value":"{name:\"woder22\",id:\"bbd02ce0-24de-4683-8c8f-5d7e6b7dffa6\",}"},"text":"woder22"},"hi"]} 

Everything работает нормально, пока я не дойду до «с» частью, я пытаюсь разобрать его с помощью следующих объектов POJO

public class ChatMessage { 
    private String text = ""; 
    private String translate; 
    private List<With> with = new ArrayList<With>(); 
    private String score; 
    private String selector; 
    private List<Node> extra; 
    private String bold = "false"; 
    private String italic = "false"; 
    private String underlined = "false"; 
    private String strikethrough = "false"; 
    private String obfuscated = "false"; 
    private String color; 
    private Clicked clickEvent; 
    private Hover hoverEvent; 
    private String insertion; 

    //getter and setter method here 

} 

class Node { 
    private String color; 
    private String text; 

    public String getColor() { 
     return color; 
    } 
    public void setColor(String color) { 
     this.color = color; 
    } 
    public String getText() { 
     return text; 
    } 
    public void setText(String text) { 
     this.text = text; 
    } 
} 

class Clicked { 
    private String action; 
    private String value; 

    public String getAction() { 
     return action; 
    } 
    public void setAction(String action) { 
     this.action = action; 
    } 
    public String getValue() { 
     return value; 
    } 
    public void setValue(String value) { 
     this.value = value; 
    } 
} 

class Hover { 
    private String action; 
    private String value; 

    public String getAction() { 
     return action; 
    } 
    public void setAction(String action) { 
     this.action = action; 
    } 
    public String getValue() { 
     return value; 
    } 
    public void setValue(String value) { 
     this.value = value; 
    } 
} 

Я изменил это, чтобы показать весь код

public class With { 
    private String translate; 
    private Clicked clickEvent; 
    private Hover hoverEvent; 
    private String insertion; 
    private String text = ""; 

    //setter and getters 

    public ChatMessage getNonNull(ChatMessage mes){ 
     if(this.text != null)mes.setText(this.text); 
     if(this.translate != null)mes.setTranslate(this.translate); 
     if(this.score != null)mes.setScore(this.score); 
     if(this.selector != null)mes.setSelector(this.selector); 
     if(this.extra != null)mes.setExtra(this.extra); 
     if(this.bold != null)mes.setBold(this.bold); 
     if(this.italic != null)mes.setItalic(this.italic); 
     if(this.underlined != null)mes.setUnderlined(this.underlined); 
     if(this.strikethrough != null)mes.setStrikethrough(this.strikethrough); 
     if(this.obfuscated != null)mes.setObfuscated(this.obfuscated); 
     if(this.color != null)mes.setColor(this.color); 
     if(this.clickEvent != null)mes.setClickEvent(this.clickEvent); 
     if(this.hoverEvent != null)mes.setHoverEvent(this.hoverEvent); 
     if(this.insertion != null)mes.setInsertion(this.insertion); 
     return mes; 
    } 
} 

Теперь проблема заключается в том, что Gson пытается разобрать это, конечно, сталкивается с проблемой, что вторая часть массива «с» не является объектом «С». Моя проблема в том, что я понятия не имею, как с этим бороться. Любая помощь будет принята с благодарностью.

Edit1 Что предполагают сделать: с массивом просто предполагают, чтобы быть своего рода «перезаписать», как и в любой области от основной строки могут быть перезаписаны и индивидуально отформатированы внутри. То, что означает нулевое значение в нижней части класса С, возможно, должно редактировать основные переменные с их перезаписанным содержимым. Предположительно, это неназванное поле будет текстовой переменной.

+0

Что вы хотите добавить к этому "привет"? Сохраните его в списке? Отменить его? –

+0

О да - я пытаюсь поместить его в переменную, в данном случае переменную «текст» (ее фактический текст, а остальное здесь - форматирование), если это помогает, вот документация по фактической строке json используется здесь: http://wiki.vg/Chat – woder

+0

Связанная с документацией не показывает эту конкретную структуру (говоря о массиве). В любом случае вы можете написать собственный десериализатор для анализа этого JSON по своему усмотрению. –

ответ

4

Вот как вы могли бы написать собственный десериализатор для этого:

class ChatMessageDezerializer implements JsonDeserializer<ChatMessage> { 
    @Override 
    public ChatMessage deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
     ChatMessage message = new ChatMessage(); 
     JsonObject obj = json.getAsJsonObject(); 
     message.translate = obj.get("translate").getAsString(); 
     JsonArray array = obj.getAsJsonArray("with"); 
     message.with.add(context.deserialize(array.get(0), With.class)); 
     message.with.add(array.get(1).getAsString()); 
     return message; 
    } 
} 

и зарегистрировать его в Gson парсер:

Gson gson = new GsonBuilder().registerTypeAdapter(ChatMessage.class, new ChatMessageDezerializer()).create(); 

Обратите внимание, что with теперь является List<Object> с наиболее специфичную общего типа к элементам в массиве относятся Object. Также я просто сделал проблематичную часть, остальное можно легко обработать. Запустив это, вы получите

[[email protected], hi] 

как итоговый список. Это предполагает, что у вас есть минимальный контроль над структурой, которую вы возвращаете (или, по крайней мере, знаете, в каком формате она будет). Он должен дать вам хорошую отправную точку оттуда.

+0

Эй! Он работает славно! Большое спасибо! – woder

+0

@Alexis, можете ли вы рассказать мне что-то о Generic типа, как вы реализовали в коде, у меня мало знаний (например, как использовать в ArrayList ) о них и вы хотите узнать, как работать с дженериками –

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