2017-02-19 5 views
0

Я нахожусь в ситуации, когда я должен разобрать следующий JSON:GSON Deserialize строка два целых чисел

{ "maj:min": "8:80" } 

Я знаю, что майор и мин всегда будет целочисленным типа, поэтому класс я разбор имеет оба этих поля как целые числа:

public int maj; 
public int min; 

Как я могу получить GSON дать «майор: мин» поле специальной пропитку и разобрать его, соответственно, в то время как десериализации?

+0

Можете ли вы изменить структуру json так, чтобы она была {"maj": 8, "min": 80}? Это будет более легко разбираться с помощью GSON. –

+0

У меня нет контроля над тем, как я получаю JSON. – octavio

+0

Как насчет пользовательского десериализатора (http://stackoverflow.com/questions/8165412/gson-custom-deserializing-logic-based-on-field-name)? Похоже, что для этого простого случая очень много работы, но должно работать. –

ответ

2

Построить модель для настраиваемого поля:

public class CustomHour { 

    public int maj; 
    public int min; 

    public CustomHour(int maj, int min) { 
     this.maj = maj; 
     this.min = min; 
    } 
} 

построить десериализатор для этого пользовательского класса:

public class CustomHourDeserializer implements JsonDeserializer<CustomHour> { 

    public CustomHour deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) { 

     String[] data = json.getAsJsonPrimitive().getAsString().split(":"); 
     int maj = Integer.parseInt(data[0]); 
     int min = Integer.parseInt(data[1]); 
     return new CustomHour(maj, min); 
    } 
} 

Построить свой Data класс, встраивать пользовательское поле (с именем поля):

public class Data { 

    @SerializedName("maj:min") 
    public CustomHour hour; 
} 

CustomHourDeserializer как тип объявления apter перед десериализацией:

String input = "{ \"maj:min\": \"8:80\" }"; 
GsonBuilder gsonBuilder = new GsonBuilder(); 
gsonBuilder.registerTypeAdapter(CustomHour.class, new CustomHourDeserializer()); 
Gson gson = gsonBuilder.create(); 
Data data = gson.fromJson(input, Data.class); 
System.out.println("min : " + data.hour.min + " | max : " + data.hour.maj); 
+0

Ницца! Я получаю все значение как String, даже некоторые из них всегда целые. Можете ли вы помочь мне в том, как правильно их разбирать? – octavio

+1

Можете ли вы привести пример ввода данных? –

+0

, например. {"size": "1000"} - но я мог бы легко решить это, просто используя аннотации в моем классе, например. @SerializedName ("size") private int size; Благодарю. – octavio

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