2017-02-23 9 views
1

Я пытаюсь сопоставить JSON-файл с набором классов, которые я создал на Java. Мало того, что я пытаюсь выполнить. Я стараюсь, чтобы «Горшок -> Семя -> Уборочная корзина -> Уборочный предмет», где: Горшок: латунь, глина, деревянная Семена: Зерно, фрукты Корзина для сбора урожая: (список предметов, семя будет возвращать) урожая Содержание: деталь и количество диапазонGSON Сопоставление из файла JSON в Java Класс

Вот JSON Я настроен (быть нежным, я n00b):

{ 
"Pot": [ 
{"potType": "Clay", 
"Seed": [ 
    {"seedType": "Grain", 
    "HarvestBasket" : [ 
     {"harvestBasketID": 1, "harvestBasketName": "temp", "chance": 25, 
     "harvestContent": [ 
      {"harvestItem": "Wheat", "min": 3, "max": 6}, 
      {"harvestItem": "Corn", "min": 1, "max": 3} 
      ] 
     }, 
     {"harvestBasketID": 2, "harvestBasketName": "temp", "chance": 50, 
     "harvestContent": [ 
      {"harvestItem": "Rice", "min": 10, "max": 12} 
      ] 
     }, 
     {"harvestBasketID": 3, "harvestBasketName": "temp", "chance": 25, 
     "harvestContent": [ 
      {"harvestItem": "Corn", "min": 1, "max": 3}, 
      {"harvestItem": "Spelt", "min": 5, "max": 6} 
      ] 
     } 
    ] 
    }, 
    {"seedType": "Fruit", 
    "HarvestBasket" : [ 
     {"harvestBasketID": 1, "harvestBasketName": "temp", "chance": 25, 
     "harvestContent": [ 
      {"harvestItem": "Apple", "min": 3, "max": 5}, 
      {"harvestItem": "Orange", "min": 1, "max": 3} 
      ] 
     }, 
     {"harvestBasketID": 2, "harvestBasketName": "temp", "chance": 50, 
     "harvestContent": [ 
      {"harvestItem": "Tangerine", "min": 10, "max": 12} 
      ] 
     }, 
     {"harvestBasketID": 3, "harvestBasketName": "temp", "chance": 25, 
     "harvestContent": [ 
      {"harvestItem": "Kiwi", "min": 1, "max": 3}, 
      {"harvestItem": "Apple", "min": 5, "max": 6} 
      ] 
     } 
    ] 
    } 
] 
}, 

{"potType": "Brass",  
"Seed": [ 
    {"seedType": "Grain", 
    "HarvestBasket" : [ 
     {"harvestBasketID": 1, "harvestBasketName": "temp", "chance": 25, 
     "harvestContent": [ 
      {"harvestItem": "Wheat", "min": 20, "max": 20}, 
      {"harvestItem": "Corn", "min": 20, "max": 20} 
      ] 
     }, 
     {"harvestBasketID": 2, "harvestBasketName": "temp", "chance": 50, 
     "harvestContent": [ 
      {"harvestItem": "Rice", "min": 20, "max": 20} 
      ] 
     }, 
     {"harvestBasketID": 3, "harvestBasketName": "temp", "chance": 25, 
     "harvestContent": [ 
      {"harvestItem": "Corn", "min": 1, "max": 3}, 
      {"harvestItem": "Spelt", "min": 20, "max": 20} 
      ] 
     } 
    ] 
    }, 
    {"seedType": "Fruit", 
    "HarvestBasket" : [ 
     {"harvestBasketID": 1, "harvestBasketName": "temp", "chance": 25, 
     "harvestContent": [ 
      {"harvestItem": "Apple", "min": 25, "max": 25}, 
      {"harvestItem": "Orange", "min": 25, "max": 25} 
      ] 
     }, 
     {"harvestBasketID": 2, "harvestBasketName": "temp", "chance": 50, 
     "harvestContent": [ 
      {"harvestItem": "Tangerine", "min": 25, "max": 25} 
      ] 
     }, 
     {"harvestBasketID": 3, "harvestBasketName": "temp", "chance": 25, 
     "harvestContent": [ 
      {"harvestItem": "Kiwi", "min": 25, "max": 25}, 
      {"harvestItem": "Apple", "min": 25, "max": 25} 
      ] 
     } 
    ] 
    } 
] 
} 

] 
} 

у меня есть следующие настройки классов. Обратите внимание: сначала я добавил значения в классы, и теперь я пытаюсь заставить JSON присваивать значения, поэтому теоретически настройка класса должна быть хорошей.

public class Pot { 
String potType; 
List <Seed> seedType; 

public Pot(String potType, List<Seed> seedItems) { 
    this.potType = potType; 
    this.seedType = seedItems; 
} 

public String getPotType() { 
    return this.potType; 
} 

public void setPotType(String potType) { 
    this.potType = potType; 
} 
} 

public class Seed { 
String seedType; 
List <HarvestBasket> harvestBasket; 

public Seed(String seedType, List <HarvestBasket> harvestBasket) { 
    this.seedType = seedType; 
    this.harvestBasket = harvestBasket; 
} 
} 

public class HarvestBasket { 
int harvestBasketID; 
String harvestBasketName; 
int chance; 
List <HarvestContent> harvestContent; 

public HarvestBasket (int harvestBasketID, String harvestBasketName, int chance, List <HarvestContent> harvestContent) { 
    this.harvestBasketID = harvestBasketID; 
    this.harvestBasketName = harvestBasketName; 
    this.chance = chance; 
    this.harvestContent = harvestContent; 
} 

} 

public class HarvestContent { 
String harvestItem; 
int min, max; 

public HarvestContent(String harvestItem, int min, int max) { 
    this.harvestItem = harvestItem; 
    this.min = min; 
    this.max = max; 
} 
} 

public class HarvestContent { 
String harvestItem; 
int min, max; 

public HarvestContent(String harvestItem, int min, int max) { 
    this.harvestItem = harvestItem; 
    this.min = min; 
    this.max = max; 
} 
} 

Итак, я использую GSON, и это, кажется, чтение в файл, но когда я выход на что-нибудь, я получаю исключения NullPointer. Я не уверен, если импорт не работает или что ... Вот код, я баловаться с:

class Response { 
Map<String, Pot> myPot; 

public Map<String, Pot> getPot() { 
    return myPot; 
} 
} 

    public static void JSONAssign() { 

    Gson gson = new Gson(); 
    BufferedReader br = null; 


    try { 
     br = new BufferedReader(new FileReader("/Users/patkhumprakob/Documents/workspace/Plants/src/harvestLoot.json")); 

     Response response; 
     try { 
      response = gson.fromJson(br, Response.class); 
      System.out.println(response.hashCode()); 
      System.out.println(response.toString()); 

      System.out.println(response.getPot().getClass()); 

Ответ консоли я получаю:

1717159510 
[email protected] 
Exception in thread "main" java.lang.NullPointerException 
at PlantsMain.JSONAssign(PlantsMain.java:56) 
at PlantsMain.main(PlantsMain.java:36) 

Я попробовал другие вещи, как переход к функции Get, но я решил, что если я не смогу вернуть тип класса, у меня возникнут большие проблемы.

ответ

1

Определить следующие классы:

class Pots { 
    List<Pot> Pot; 
    } 

    class Pot { 
    protected String potType; 
    protected List<Seed> Seed; 
    } 

    class HarvestBasket { 
    protected String harvestBasketID; 
    protected String harvestBasketName; 
    protected int chance; 
    protected List<HarvestContent> harvestContent; 
    } 

    class HarvestContent { 
    protected String harvestItem; 
    protected int min; 
    protected int max; 
    } 

    class Seed { 
    protected String seedType; 
    protected List<HarvestBasket> HarvestBasket; 
    } 

Затем используйте:

Gson gson = new Gson(); 
Pots pots = gson.fromJson("Your JSON content", Pots.class); 

Надеется, что это помогает.

+0

спасибо. Попробуем утром. Не могли бы вы объяснить, почему ваше решение работает? Я пытаюсь узнать ... Является ли это сопоставление имен классов с JSON, которые я испортил? –

+0

@PatK: Пожалуйста, обратитесь к этому http://stackoverflow.com/questions/19169754/parsing-nested-json-data-using-gson Ключевое слово: «inested json parsing by gson». – Haven

+0

Спасибо. Я вижу, что я сделал неправильно ... Не делал конечно, чтобы имена классов и переменные соответствовали JSON. –

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