Я хочу добавить свойство к JSON Object с массивом целых чисел в качестве значения в Java - PullRequest
2 голосов
/ 15 января 2020

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

{
  "id": 1,
  "name": "Whatever",
  "indices": [1, 2, 3, 4]
}

Запуск следующего кода:

private void createJsonWithArrayAsPropertyValue() throws IOException {
    JsonObjectBuilder job = Json.createObjectBuilder();
    job.add("id", 1);
    job.add("name", "no-name");
    job.add("indices", Json.createArrayBuilder()
            .add(1)
            .add(2)
            .add(3)
            .build());
    System.out.println(new StringBuffer("\tJSON String = ").append(job.toString()).append("\n"));

    JsonObject jsonObject = job.build();
    Writer writer = new StringWriter();

    //  region Print the JSON object into a String
    Json.createWriter(writer).write(jsonObject);
    StringBuffer jsonString = new StringBuffer(writer.toString());
    System.out.println(new StringBuffer("\tjsonString = ").append(jsonString).append("\n"));
    //  endregion

    //  region Print the JSON using PRETTY_PRINTING format
    Map<String, Boolean> config = new HashMap<>();
    config.put(JsonGenerator.PRETTY_PRINTING, true);
    JsonWriterFactory writerFactory = Json.createWriterFactory(config);
    writer = new StringWriter();
    writerFactory.createWriter(writer).write(jsonObject);
    jsonString = new StringBuffer(writer.toString());
    System.out.println(new StringBuffer("\tjsonString (PRETTY_PRINTING) = ").append(jsonString).append("\n"));
    //  endregion Print the JSON using PRETTY_PRINTING format
    System.out.println("-------------------------------------------------");

}

Создает объект JSON, используя com.json.JSONObject Свойство indexes вводится в виде строки:

{
  "id": 1,
  "name": "Whatever",
  "indices": "[1, 2, 3]"
}

Я ищу решение, которое не будет вводить значение элемента в качестве строки, и я не ограничен использованием какого-либо определенного c пакета.

ОБНОВЛЕНИЕ Использование javax.json.Json как такового:

    jo.put("indices", Json.createArrayBuilder()
            .add(1)
            .add(2)
            .add(3)
            .build());

pom . xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.beniregev</groupId>
    <artifactId>demos_and_tutorials</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demos_and_tutorials</name>
    <description>Java 8 + Spring Boot project for demos and tutorials</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.RC1</spring-cloud.version>
        <javafaker.version>0.17.2</javafaker.version>
        <mapdb.version>3.0.7</mapdb.version>
        <android-json.version>0.0.20131108.vaadin1</android-json.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-oauth2-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.json/javax.json-api -->
        <dependency>
            <groupId>javax.json</groupId>
            <artifactId>javax.json-api</artifactId>
            <version>1.1.4</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.glassfish/javax.json -->
        <dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>javax.json</artifactId>
            <version>1.1.4</version>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.github.javafaker</groupId>
            <artifactId>javafaker</artifactId>
            <version>${javafaker.version}</version>
        </dependency>
        <dependency>
            <groupId>io.projectreactor</groupId>
            <artifactId>reactor-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.mapdb/mapdb -->
        <dependency>
            <groupId>org.mapdb</groupId>
            <artifactId>mapdb</artifactId>
            <version>${mapdb.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.vaadin.external.google</groupId>
            <artifactId>android-json</artifactId>
            <version>${android-json.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>

</project>

ОБНОВЛЕНИЕ 2: Я добавил зависимость для org.glassfi sh, чтобы javax.json мог работать, так как скажем, по Java JSON Учебное пособие - JSON Java, а также по Java API для JSON Обработка - Начало работы . Обновление 3 Исключение, которое я получил из-за конфликта между зависимостями в моем pom. xml Я переместил свой код в отдельный проект и работает .

Я получаю исключение (я что-то упустил в моем пом. xml?):

javax.json.JsonException: Provider org.glassfish.json.JsonProviderImpl not found
    at javax.json.spi.JsonProvider.provider(JsonProvider.java:99)
    at javax.json.Json.createArrayBuilder(Json.java:262)
    at com.beniregev.demos_and_tutorials.demos.JsonDemo.simpleJsonObjectWithArrayAsValue(JsonDemo.java:41)
    at com.beniregev.demos_and_tutorials.demos.JsonDemo.main(JsonDemo.java:57)
Caused by: java.lang.ClassNotFoundException: org.glassfish.json.JsonProviderImpl
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:315)
    at javax.json.spi.JsonProvider.provider(JsonProvider.java:96)
    ... 3 more

Я буду признателен за любую помощь.

1 Ответ

1 голос
/ 15 января 2020

Для документов на JSONObject вам необходимо использовать Json.createArrayBuilder():

private void simpleJsonObjectWithArrayAsValue() throws JSONException {
    JSONObject jo = new JsonObject();
    jo.put("id", Json.createValue(1));
    jo.put("name", Json.createValue("Whatever"));
    jo.put("indices", Json.createArrayBuilder()
        .add(1)
        .add(2)
        .add(3)
        .build());

    System.out.println("JSON String = " + new StringBuffer().append(jo.toString() + "\n");
}

Если у вас есть существующий массив, вам нужно l oop над ним и вызов .add() для каждого элемента.

...