2016-12-21 5 views
0

Я пытаюсь создать плагин, где я храню некоторые данные элементов Minecraft вместе с некоторыми свойствами.Java get Список карт карт из config.yml

Это содержимое моего YAML файла:

rates: 
- 391: 
    mul: 10000 
    store: 5000 
- 392: 
    mul: 9000 
    store: 5000 

Так это в основном список карт, карт (я так думаю, по крайней мере). Это мой JAVA код, где я пытаюсь получить доступ к ключу «MUL» от «391»:

List<Map<?,?>> rates; 
rates= getConfig().getMapList("rates"); 
for(Map<?,?> mp : rates){ 
    Map <?,?> test = (Map<?,?>) mp.get("" + item); 
    player.sendMessage(test.toString());// HERE I get null pointer exception, and the following lines if this line wasn't there in the first place 
    player.sendMessage("Mul is: " + test.get("mul")); 
    player.sendMessage("Store is: " + test.get("store")); 
} 

В соответствии с предложенным ответом, вот мой тестовый код, где я все еще получаю NullPointerException:

import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.util.Map; 

import net.sourceforge.yamlbeans.YamlException; 
import net.sourceforge.yamlbeans.YamlReader; 

public class Test { 

public static void main(String[] args) throws FileNotFoundException, YamlException{ 
    YamlReader reader = new YamlReader(new FileReader("config.yml")); 
    Map map = (Map) reader.read(); 
    Map itemMap = (Map) map.get("391"); 
    System.out.println(itemMap.get("mul"));//This is where I get the exception now 
    System.out.println(itemMap.get("store")); 
} 
} 
+2

Возможный дубликат [Что такое исключение NullPointerException и как его исправить?] (Http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix -it) – pvg

+0

@pvg Я знаю, что такое NullPointerException, я просто не знаю, почему это происходит с моим кодом. Я полагаю, это связано с анализом ямля. –

+0

Это все еще обман, потому что ответ о том, как диагностировать причину NPE - сделайте это, и вы почти наверняка разобраться в своей проблеме. Вы также не указали конкретное исключение, которое у вас есть, а также ваш код, что другие могут попробовать - посмотрите на рекомендации о том, как написать [MCVE] – pvg

ответ

2

Parsing yaml вручную может быть утомительным и подверженным ошибкам. Возможно, было бы проще использовать библиотеку, например, yamlbeans.

http://yamlbeans.sourceforge.net/

package com.jbirdvegas.q41267676; 

import com.esotericsoftware.yamlbeans.YamlReader; 

import java.io.StringReader; 
import java.util.List; 
import java.util.Map; 

public class YamlExample { 
    public static void main(String[] args) throws Exception { 

     String yamlInput = 
       "rates:\n" + 
         "- 391:\n" + 
         " mul: 10000\n" + 
         " store: 5000\n" + 
         "- 392:\n" + 
         " mul: 9000\n" + 
         " store: 5000"; 

     YamlReader reader = new YamlReader(new StringReader(yamlInput)); 
     Map map = (Map) reader.read(); 
     // rates is a list 
     List<Map> rates = (List<Map>) map.get("rates"); 
     // each item in the list is a map 
     for (Map itemMap : rates) { 
      // each map contains a single map the key is [ 391|392 ] 
      itemMap.forEach((key, value) -> { 
       System.out.println("Key: " + key); 
       // the value in in this map is itself a map 
       Map embededMap = (Map) value; 
       // this map contains the values you want 
       System.out.println(embededMap.get("mul")); 
       System.out.println(embededMap.get("store")); 
      }); 
     } 
    } 
} 

Печатается:

Key: 391 
10000 
5000 
Key: 392 
9000 
5000 

Это простой UseCase но yamlbeans также обеспечивает GSON как модель популяции отражательной класса, если это будет лучше всего подходит для ваших нужд.

+0

Вы пробовали это решение? Я по-прежнему получаю исключение из null-указателя, но на этот раз в строке itemMap.get ("mul"). –

+0

Обновленный ответ с полным кодом для разбора, я неправильно понял формат сначала – JBirdVegas

+0

Спасибо! Прекрасно работает –

0

Ваши предположения, что этот YAML является списком карт, неверен. На верхнем уровне есть карта с одной парой ключ-значение, ключ которой равен rates, а значение представляет собой последовательность с двумя элементами.

Каждый из этих элементов является сопоставлением с одной парой значений ключа, ключ которого представляет собой число (391, 392), и значение которого представляет собой сопоставление с двумя парами ключ-значение.

То, что есть черточка (-) в левой руке, не означает, что на верхнем уровне есть последовательность (в файле YAML, который построен на вашем языке программирования, нет списков). Если последовательность является значением для конкретного ключа, эти элементы последовательности могут иметь тот же уровень отступов, что и ключ, как в вашем файле YAML.