Почему JSON не написан? - PullRequest
       11

Почему JSON не написан?

0 голосов
/ 24 августа 2018

Это код:

public static void init() {
    File file = new File(SimpleMessagesAPI.getMainAPI().getDataFolder(), "config.json");
    try {

        ObjectMapper objectMapper = new ObjectMapper();
        ArrayNode arrayNode = objectMapper.createArrayNode();
        ObjectNode firstObjectNode = objectMapper.createObjectNode();
        ObjectNode secondObjectNode = objectMapper.createObjectNode();

        firstObjectNode.put("period", 5);
        firstObjectNode.put("async", true);
        firstObjectNode.put("country", "Europe/Bucharest");

        secondObjectNode.putArray("broadcast")
                .add("&7Hello players! Now is %server_online players!")
                .add("&eNow is %time")
                .add("&6Thanks for playing on that server!")
                .add("&cHave fun guys! %motd");

        ArrayNode firstArrayNode = objectMapper.createArrayNode();
        firstArrayNode.add(firstObjectNode);

        ArrayNode secondArrayNode = objectMapper.createArrayNode();
        secondArrayNode.add(secondObjectNode);

        ObjectNode principalObjectNode = objectMapper.createObjectNode();
        principalObjectNode.putPOJO("mechanic", firstArrayNode);

        ObjectNode secondarObjectNode = objectMapper.createObjectNode();
        secondarObjectNode.putPOJO("messages", secondArrayNode);

        arrayNode.add(principalObjectNode);
        arrayNode.add(secondarObjectNode);

        if (!file.exists()) {
                file.createNewFile();
                objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(arrayNode);
        }

        /*String json = file.toString();
        JsonNode jsonNode = objectMapper.readTree(json);
        String messages = jsonNode.get("messages").asText();
        String mechanic = jsonNode.get("mechanic").asText();
        System.out.println("Messages: " + messages + "\n\n\n" + "Mechanic: " + mechanic + "\n\n");*/
        //ObjectConfig config = new ObjectConfig(messages, mechanic);
        //objectMapper.writeValue(new File(SimpleMessagesAPI.getMainAPI().getDataFolder() + "config.json"), config);

    } catch (IOException e) {
            e.printStackTrace();
    }
}

И это JSON, который я хочу создать:

{
  "mechanic": {
    "period"          : 5,
    "async"           : true,
    "country"         : "Europe/Bucharest"
  },
  "messages": {
    "broadcast"       : [
      "&7Hello players! Now is %server_online players!",
      "&eNow is %time",
      "&6Thanks for playing on that server!",
      "&cHave fun guys! %motd"
    ]
  }
}

Но когда я выполнил код, это создало пустой объект JSON, почему?

И file.createNewFile(); говорит "результат игнорируется".

Большое спасибо за помощь, ребята

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Есть две проблемы с вашими строками кода

file.createNewFile();
objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(arrayNode);
  1. Вы получили предупреждение компилятора на file.createNewFile();, говорящее результат игнорируется , потому что вы проигнорировалилогический результат, возвращаемый file.createNewFile().

    Вам лучше сделать что-то вроде этого:

    if (!file.createNewFile())
        throw new IOException("could not create file " + file);
    
  2. Ваш вызов метода .writeValueAsString(arrayNode) простосоздает строку JSON, но нигде не записывает эту строку.

    Вместо нее необходимо использовать .writeValue(file, arrayNode).

0 голосов
/ 24 августа 2018

Я могу предложить вам более простой способ создания JSON из структурированных данных. Вы можете создать три класса, которые представляют вашу структуру JSON. И вы можете просто инициализировать экземпляр объекта и сериализовать его с помощью ObjectMapper.

Вот альтернативный способ:

package yourPackage;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;

import java.util.Arrays;
import java.util.List;

public class Test {
    public String serializeData() throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();

        MyJson json = new MyJson();
        Mechanic mechanic = new Mechanic();
        mechanic.setAsync(true);
        mechanic.setCountry("Europe/Bucharest");
        mechanic.setPeriod(5);

        Message message = new Message();
        List<String> messages = Arrays.asList(
                "&7Hello players! Now is %server_online players!",
                "&eNow is %time",
                "&6Thanks for playing on that server!",
                "&cHave fun guys! %motd");

        message.setBroadcast(messages);

        json.setMechanic(mechanic);
        json.setMessages(message);

        return mapper.writeValueAsString(json);
    }
}

@Data // comes from lombok
class MyJson {
    private Mechanic mechanic;
    private Message messages;
}

@Data
class Mechanic{
    private int period;
    private boolean async;
    private String country;
}

@Data
class Message {
    private List<String> broadcast;
}

Серийный вывод:

{
    "mechanic": {
        "period": 5,
        "async": true,
        "country": "Europe/Bucharest"
    },
    "messages": {
        "broadcast": [
            "&7Hello players! Now is %server_online players!",
            "&eNow is %time",
            "&6Thanks for playing on that server!",
            "&cHave fun guys! %motd"
        ]
    }
}

Вы можете записать в файл описания следующую строку:

    Files.write(Paths.get("config.json"), serializeData().getBytes());

Maven для ломбок:

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...