Analysieren und objektivieren Sie JSON mithilfe der Annotation @JsonProperty von Jackson, einer Java-Bibliothek

Überblick

JSON wird diesmal analysiert

{
  "user": {
    "name": "Pompom Pudding",
    "score": {
      "kokugo": "good",
      "sansuu": 100
    },
    "favorites": ["soccer", "puzzle"]
  }
}

Analysieren und objektivieren Sie JSON auf verschiedene Arten

Beim direkten Erstellen eines Map-Objekts ohne Vorbereitung einer Klasse (keine Anmerkung verwendet)

Sie können ein Map-Objekt erhalten, indem Sie Map.class als zweites Argument von ObjectMapper # readValue übergeben. Das Erstellen eines Objekts ist einfach, das Abrufen der gewünschten Daten aus dem erstellten Objekt ist jedoch kompliziert.

ObjectMapper mapper = new ObjectMapper();
Map obj = mapper.readValue(json, Map.class);
System.out.println(obj);
String name = (String)(((Map)obj.get("user")).get("name"));
System.out.println("name=" + name);

Ausgabebeispiel.

{user={name=Pompom Pudding, score={kokugo=good, sansuu=100}, favorites=[soccer, puzzle]}}
name=Pompom Pudding

Beim Vorbereiten einer öffentlichen Instanzvariablen in einer Klasse (keine Anmerkung verwendet)

Es kann zu einem Objekt gemacht werden, indem eine öffentliche Instanzvariable oder ein Getter-Setter vorbereitet wird. In diesem Fall ist es nicht erforderlich, die Annotation @ JsonProperty zu schreiben.

import java.util.Map;
public class PublicUserObject {
  public Map user;
}
ObjectMapper mapper = new ObjectMapper();
PublicUserObject obj = mapper.readValue(json, PublicUserObject.class);
System.out.println(obj);
String name = (String)obj.user.get("name");
System.out.println("name=" + name);

Ausgabebeispiel.

PublicUserObject@e6abefac
name=Pompom Pudding

Beim Vorbereiten einer privaten Instanzvariablen in einer Klasse (mithilfe von Anmerkungen)

Bei Verwendung einer privaten Instanzvariablen muss der JSON-Schlüssel (Name) angegeben werden, der mit @ JsonProperty zugeordnet werden soll.

import java.util.Map;
import com.fasterxml.jackson.annotation.JsonProperty;

public class SimpleUserObject {

  @JsonProperty("user")
  private Map user;

  public Map getUser() {
    return user;
  }

  @Override
  public String toString() {
    return getClass().getName() + ": user:" + user;
  }
}
ObjectMapper mapper = new ObjectMapper();
SimpleUserObject obj = mapper.readValue(json, SimpleUserObject.class);
System.out.println(obj);
String name = (String) obj.getUser().get("name");
System.out.println("name=" + name);

Ausgabebeispiel.

SimpleUserObject: user:{name=Pompom Pudding, score={kokugo=good, sansuu=100}, favorites=[soccer, puzzle]}
name=Pompom Pudding

Wenn eine private Instanzvariable und eine Zugriffsmethode in der Klasse vorbereitet werden (mithilfe von Anmerkungen)

Wenn Sie die Accessor-Methode etwas fester gestalten, ist die Verwendung durch externe Klassen einfacher.

import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonProperty;

public class AccessorUserObject {

  @JsonProperty("user")
  private Map user;

  public String getName() {
    return (String) user.get("name");
  }

  private Map getScore() {
    return (Map) user.get("score");
  }

  public String getKokugoScore() {
    return (String) getScore().get("kokugo");
  }

  public int getSansuuScore() {
    return (int) getScore().get("sansuu");
  }

  public List getFavorites() {
    return (List) user.get("favorites");
  }

  @Override
  public String toString() {
    return getClass().getName() +
        ", getName: " + getName() +
        ", getKokugoScore: " + getKokugoScore() +
        ", getSansuuScore: " + getSansuuScore() +
        ", getFavorites: " + getFavorites();
  }
}
ObjectMapper mapper = new ObjectMapper();
AccessorUserObject obj = mapper.readValue(json, AccessorUserObject.class);
System.out.println(obj);
String name = obj.getName();
System.out.println("name=" + name);

Ausgabebeispiel.

AccessorUserObject, getName: Pompom Pudding, getKokugoScore: good, getSansuuScore: 100, getFavorites: [soccer, puzzle]
name=Pompom Pudding

Wenn eine Klasse für die Zuordnung vorbereitet wird (mithilfe von Anmerkungen)

Bereiten Sie eine Klasse und eine innere Klasse für die Zuordnung von JSON-Daten vor.

import java.util.List;
import com.fasterxml.jackson.annotation.JsonProperty;

public class StructedUserObject {

  @JsonProperty("user")
  public User user;

  public static class User {

    public String name;
    public Score score;
    public List favorites;

    @Override
    public String toString() {
      return getClass().getSimpleName()
          + ": name: " + name
          + ", score: " + score
          + ", favorites: " + favorites;
    }
  }

  public static class Score {

    public String kokugo;
    public int sansuu;

    @Override
    public String toString() {
      return getClass().getSimpleName()
          + ": kokugo: " + kokugo
          + ", sansuu: " + sansuu;
    }
  }

  @Override
  public String toString() {
    return getClass().getName() + ": user:" + user;
  }
}
ObjectMapper mapper = new ObjectMapper();
StructedUserObject obj = mapper.readValue(json, StructedUserObject.class);
System.out.println(obj);
String name = obj.user.name;
System.out.println("name=" + name);

Ausgabebeispiel.

StructedUserObject: user:User: name: Pompom Pudding, score: Score: kokugo: good, sansuu: 100, favorites: [soccer, puzzle]
name=Pompom Pudding

Datei- und Ausführungsumgebung, die für diese Operationsprüfung verwendet wird

Java und Maven

$ mvn --version
Apache Maven 3.6.1 (d66c9c0b3152b2e69ee9bac180bb8fcc8e6af555; 2019-04-05T04:00:29+09:00)
Maven home: /usr/local/Cellar/maven/3.6.1/libexec
Java version: 11.0.2, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/openjdk-11.0.2.jdk/Contents/Home
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.14.5", arch: "x86_64", family: "mac"

Dateiliste

├── pom.xml
├── src
│   └── main
│       └── java
│           └── info
│               └── maigo
│                   └── lab
│                       └── myjacksonsamples
│                           ├── AccessorUserObject.java
│                           ├── Main.java
│                           ├── PublicUserObject.java
│                           ├── SimpleUserObject.java
│                           └── StructedUserObject.java
└── user.json

pom.xml

Bereiten Sie eine pom.xml-Datei vor, damit sie von Maven erstellt und ausgeführt werden kann. Fügen Sie den Abhängigkeiten die Jackson-Bibliotheken Jackson-Core, Jackson-Databind und Jackson-Annotations hinzu. Fügen Sie den Plugins das exec-maven-Plugin hinzu, damit Sie Java-Programme von Maven aus ausführen können.

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>info.maigo.lab</groupId>
  <artifactId>my-jackson-samples</artifactId>
  <version>1.0-SNAPSHOT</version>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
  </properties>

  <!-- $ mvn exec:java -->
  <!-- https://www.mojohaus.org/exec-maven-plugin/ -->
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.6.0</version>
        <configuration>
          <mainClass>info.maigo.lab.myjacksonsamples.Main</mainClass>
        </configuration>
      </plugin>
    </plugins>
  </build>

  <dependencies>

    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.9</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.9</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.9.9</version>
    </dependency>

  </dependencies>

</project>

Ein Befehl zum Generieren einer JAR-Datei.

$ mvn package

Ein Befehl zum Ausführen des Beispielprogramms.

$ mvn exec:java

Java-Quellcode

Main.java

package info.maigo.lab.myjacksonsamples;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Map;

import com.fasterxml.jackson.databind.ObjectMapper;

public class Main {

    public static void main(String[] args) throws IOException {
        String json = Files.readString(Path.of("user.json"), StandardCharsets.UTF_8);
        createMappedUserObject(json);
        createPublicUserObject(json);
        createSimpleUserObject(json);
        createAccessorUserObject(json);
        createStructedUserObject(json);
    }

    private static void createMappedUserObject(String json) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        Map obj = mapper.readValue(json, Map.class);
        System.out.println(obj);
        String name = (String) (((Map) obj.get("user")).get("name"));
        System.out.println("name=" + name);
    }

    private static void createPublicUserObject(String json) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        PublicUserObject obj = mapper.readValue(json, PublicUserObject.class);
        System.out.println(obj);
        String name = (String) obj.user.get("name");
        System.out.println("name=" + name);
    }

    private static void createSimpleUserObject(String json) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        SimpleUserObject obj = mapper.readValue(json, SimpleUserObject.class);
        System.out.println(obj);
        String name = (String) obj.getUser().get("name");
        System.out.println("name=" + name);
    }

    private static void createAccessorUserObject(String json) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        AccessorUserObject obj = mapper.readValue(json, AccessorUserObject.class);
        System.out.println(obj);
        String name = obj.getName();
        System.out.println("name=" + name);
    }

    private static void createStructedUserObject(String json) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        StructedUserObject obj = mapper.readValue(json, StructedUserObject.class);
        System.out.println(obj);
        String name = obj.user.name;
        System.out.println("name=" + name);
    }
}

PublicUserObject.java

package info.maigo.lab.myjacksonsamples;

import java.util.Map;

public class PublicUserObject {

    public Map user;

}

SimpleUserObject.java

package info.maigo.lab.myjacksonsamples;

import com.fasterxml.jackson.annotation.JsonProperty;

import java.util.Map;

public class SimpleUserObject {

    @JsonProperty("user")
    private Map user;


    public Map getUser() {
        return user;
    }

    @Override
    public String toString() {
        return getClass().getName() + ": user:" + user;
    }
}

AccessorUserObject.java

package info.maigo.lab.myjacksonsamples;

import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.annotation.JsonProperty;

public class AccessorUserObject {

    @JsonProperty("user")
    private Map user;

    public String getName() {
        return (String) user.get("name");
    }

    private Map getScore() {
        return (Map) user.get("score");
    }

    public String getKokugoScore() {
        return (String) getScore().get("kokugo");
    }

    public int getSansuuScore() {
        return (int) getScore().get("sansuu");
    }

    public List getFavorites() {
        return (List) user.get("favorites");
    }

    @Override
    public String toString() {
        return getClass().getName() +
                ", getName: " + getName() +
                ", getKokugoScore: " + getKokugoScore() +
                ", getSansuuScore: " + getSansuuScore() +
                ", getFavorites: " + getFavorites();
    }
}

StructedUserObject.java

package info.maigo.lab.myjacksonsamples;

import java.util.List;

import com.fasterxml.jackson.annotation.JsonProperty;

public class StructedUserObject {

    @JsonProperty("user")
    public User user;

    public static class User {

        public String name;
        public Score score;
        public List favorites;

        @Override
        public String toString() {
            return getClass().getSimpleName()
                    + ": name: " + name
                    + ", score: " + score
                    + ", favorites: " + favorites;
        }
    }

    public static class Score {

        public String kokugo;
        public int sansuu;

        @Override
        public String toString() {
            return getClass().getSimpleName()
                    + ": kokugo: " + kokugo
                    + ", sansuu: " + sansuu;
        }
    }

    @Override
    public String toString() {
        return getClass().getName() + ": user:" + user;
    }
}

user.json

{
  "user": {
    "name": "Pompom Pudding",
    "score": {
      "kokugo": "good",
      "sansuu": 100
    },
    "favorites": ["soccer", "puzzle"]
  }
}

Referenzmaterial

Recommended Posts

Analysieren und objektivieren Sie JSON mithilfe der Annotation @JsonProperty von Jackson, einer Java-Bibliothek
[Java] Versuchen Sie, die Elemente der Json-Zeichenfolge mithilfe der Bibliothek zu bearbeiten
Konvertieren Sie JSON und YAML in Java (mit Jackson und SnakeYAML)
JSON in Java und Jackson Teil 1 Gibt JSON vom Server zurück
Zeigen Sie den japanischen Kalender und Tag mit der Java8-Standardklasse an
[Java] Geben Sie das Ergebnis von ffprobe -show_streams in JSON aus und ordnen Sie es einem Objekt in Jackson zu
Ich habe die Eigenschaften von Java und .NET verglichen
JSON mit Java und Jackson Teil 2 XSS-Maßnahmen
Konvertieren Sie Java Enum Enumeration und JSON von und nach Jackson
Bitte beachten Sie die Aufteilung (Aufteilung) von Java Kotlin Int und Int
Der Vergleich von enum ist == und gleich ist gut [Java]
[Java] Sortieren Sie die Liste mit Streams und Lambda-Ausdrücken
Versuchen Sie, das Eratostenes-Sieb mithilfe der Java-Standardbibliothek zu implementieren
Den aktuellen Status von Java organisieren und die Zukunft betrachten
Java-Sprache aus der Sicht von Kotlin und C #
Ich habe die Typen und Grundlagen von Java-Ausnahmen zusammengefasst
Versuchen Sie es mit globalem Hooking in Java mithilfe der JNativeHook-Bibliothek
[Java] Konvertieren Sie JSON in Java und Java in JSON-How to use GSON and Jackson-
Konvertieren Sie mit Moshi zwischen Java-Objekten und JSON
[Java10] Achten Sie darauf, var und generics nicht zusammen zu verwenden
Geschichte der Java-Annotationen
Senden und Empfangen einfacher Nachrichten mit der Kafka-Komponente des Apache Camel-Frameworks (Java DSL Edition)
[Hinweis] Java Ausgabe der Summe von ungeraden und geraden Elementen
Ich habe das Verhalten von Java Scanner und .nextLine () nicht wirklich verstanden.
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
[Java] Vergleichsmethode für Zeichenketten und Vergleichsmethode mit regulären Ausdrücken
Befehl zum Überprüfen der Anzahl und des Status von Java-Threads
Überprüfen Sie den Status der Java-Anwendung, ohne das Überwachungstool zu verwenden
Java-Anfänger fassten das Verhalten von Array und ArrayList kurz zusammen
[Java] [jackson] Entspricht dem nachfolgenden Komma (nachgestellten Komma) beim Parsen von JSON.
Die Geschichte, Java mithilfe der BitBucket-Pipeline nach Heroku zu bringen
Ich habe versucht, die CameraX-Bibliothek mit Android Java Fragment zu verwenden
[Java] Ich habe über die Vorzüge und Verwendungen von "Schnittstelle" nachgedacht.
Herausforderungen und alternative Forschung der Java Serial Communication Library RXTX
[Java] JSON-Kommunikation mit Jackson
[Java] Erstellen von Originalanmerkungen
Vor- und Nachteile von Java
[Java] Verschiedene Zusammenfassungen an die Leiter von Klassen und Mitgliedern
[Java] Ordnen Sie die Daten des vergangenen Montags und Sonntags der Reihe nach an
Java, JS (jQuery) und Ajax. Holen Sie sich einen bestimmten Wert von JSON.
Lesen Sie die ersten 4 Bytes der Java-Klassendatei und geben Sie CAFEBABE aus
Vom jungen Java (3 Jahre) bis zu Node.js (4 Jahre). Und der Eindruck, nach Java zurückzukehren
Ich habe versucht, die Methoden von Java String und StringBuilder zusammenzufassen
[Android] Konvertieren Sie Map in JSON mit GSON mit Kotlin und Java
Ist die von Ihnen verwendete Version von Elasticsearch mit Java 11 kompatibel?