2013-06-27 3 views
0

У меня есть файл JSonTrouble файл десериализации JSON через gson

{ 
    "l": { 
     "default_level": "...", 
     "impl": "...", 
     "levels": [ 
      ..., 
      ... 
     ] 
    }, 
    "a": [ 
     { 
      "format": "...", 
      "filename": "...", 
      "rotation": "...", 
      "ls": [ 
       ..., 
       ... 
      ] 
     } 
    ] 
} 

Что я пытаюсь сопоставить

public class ABC { 

    private List<A> aList = new ArrayList<>(); 
    private L lConfig = new L(); 

    // Gettters and Setters for aList and l 

    public static class L { 
     String default_level; 
     String impl; 

     List<String> levels = new ArrayList<>(); 

     // Gettters and Setters 

     @Override 
     public String toString() { 
      // ... 
     } 
    } 

    public static class A { 
     String format; 
     String filename; 
     String rotation; 

     List<String> ls = new ArrayList<>(); 

     // Getters and Setters 

     @Override 
     public String toString() { 
      // ... 
     } 
    } 
} 

, который в настоящее время десериализованное по

public static BLAH load(String externalConfigFile) throws IOException { 
    ABC config = null; 

    Path path = Paths.get(externalConfigFile); 
    if (Files.exists(path) || Files.isReadable(path)) { 
     config = new Gson().fromJson(readFile(externalConfigFile), ABC.class); 
    } 

    return config; 
} 

, который при печать дает мне

A[] 
L{default_level='null', impl='null', levels=[]} 

Почему материал не установлен?

+0

не должны быть переменная с именем 'L' быть нанесены на карту Gson? – Jacopofar

ответ

2

Я думаю, что проблема - это просто имена атрибутов. В Gson имена атрибутов должны совпадать с именами полей в JSON.

Итак, вам нужно изменить имена атрибутов в классе ABC. Что-то вроде:

public class ABC { 

    private List<A> a; 
    private L l; 

    //All the rest is okay... 
} 

В противном случае, вы должны использовать аннотацию @SerializedName, как это:

@SerializedName("a") 
private List<A> aList; 
@SerializedName("l") 
private L lConfig; 
+1

Прямо на деньги! спасибо – JAM

0

Попробуйте использовать массив вместо списка здесь:

private A[] aList = {}; 

< Список > потеряет это < > во время выполнения и gson не будет знать, где он должен отобразить массив JSON, которую вы обеспечивая его.