2016-02-25 3 views
0

Я пытаюсь использовать модель данных из json-канала. Как я могу сопоставить смешанный объект внутри объекта?Сопоставление объектов смешанного типа с Gson

base_data Объект имеет pager быть Map<String,String> и result быть List<Map<String,String>. Можно ли создать еще один класс BaseData для сопоставления объекта и импорта обратно в класс модели? Например:

public class Model{ 

    private Map <String,BaseData> base_data; 
} 

Однако я получаю сообщение об ошибке в mixmatch getBaseData()

Весь код:

Json Объект:

{ 
    "id": "2", 
    "type":"book", 
    "base_data": { 
    "result": [ 
     { 
     "retailer": "Amazon", 
     "price": "$50" 
     }, 
     { 
     "retailer": "Target", 
     "price": "$60" 
     } 
    ], 
    "pager": { 
     "current_page": "5", 
     "link": "www.somesite.com" 
    } 
    } 
} 

класс Модель

import com.BaseData; 

public class Model{ 

    private String id; 

    private String type; 

    private Map <String,BaseData> base_data; 

    public List<Map<String,String>> getBaseData(){ 

     return base_data.get("result"); 
        ^^^^^^ Error Type mismatch: cannot convert from BaseData to List<Map<String,String>> 
    } 

} 

BaseData class

public class BaseData{ 

    Map<String,String>pager; 

    List<Map<String,String>> result; 

} 

ответ

1

Заменить частных base_data Карта; by BaseData base_data;

Я проверил следующий код и работал.

public class Main { 

    public static void main(String[] args) { 
     JsonParser parser = new JsonParser(); 
     JsonObject json = parser.parse("{\"id\":\"2\",\"type\":\"book\",\"base_data\":{\"result\":[{\"retailer\":\"Amazon\",\"price\":\"$50\"},{\"retailer\":\"Target\",\"price\":\"$60\"}],\"pager\":{\"current_page\":\"5\",\"link\":\"www.somesite.com\"}}}").getAsJsonObject(); 

     Gson gson = new Gson(); 
     Model model = gson.fromJson(json, Model.class); 

    } 
} 

class Model { 
    String id; 
    String type; 
    BaseData base_data; 
} 

class BaseData { 
    Map<String, String> pager; 
    List<Map<String,String>> result; 
} 

class Result { 
    String retailer; 
    String price; 
} 

Если вы хотите вернуть List<Map<String,String>> на метод getBaseData() вы можете конвертировать BaseData в List<Map<String,String>> в методе

1

Использование ниже ссылки для создания классов pojo. просто вставьте свой ответ json в заданное поле и укажите желаемое имя класса. и другие детали.

нажмите на кнопку «Zip» под полем json. вы получите Java-класс. используй это. наслаждаться ..

http://www.jsonschema2pojo.org/

1

Вы возвращающегося неправильный тип:

public List<Map<String,String>> getBaseData(){ 
    return base_data.get("result"); 
} 

Объявление метода должно быть изменено на:

public BaseData getBaseData(){ 
    return base_data.get("result"); 
} 

Поскольку вы звоните base_data.get("result"), вы в основном получаете объект от типа BaseData внутри карты.

Это должно устранить ошибку смешанного типа, не уверен, что она решает, что вы пытаетесь сделать, хотя

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