Analyser et objectiver JSON à l'aide de l'annotation @JsonProperty de la bibliothèque Java Jackson

Aperçu

--Utilisez Jackson, la bibliothèque JSON de Java

JSON à analyser cette fois

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

Analyser et objectiver JSON de plusieurs manières

Lors de la création d'un objet Map directement sans préparer de classe (aucune annotation utilisée)

Vous pouvez obtenir un objet Map en passant Map.class comme deuxième argument d'ObjectMapper # readValue. La création d'un objet est simple, mais la récupération des données souhaitées à partir de l'objet créé est compliquée.

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);

Exemple de sortie.

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

Lors de la préparation d'une variable d'instance publique dans une classe (aucune annotation utilisée)

Il peut être transformé en objet en préparant une variable d'instance publique ou un setter getter. Dans ce cas, il n'est pas nécessaire d'écrire l'annotation @ JsonProperty.

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);

Exemple de sortie.

PublicUserObject@e6abefac
name=Pompom Pudding

Lors de la préparation d'une variable d'instance privée dans une classe (à l'aide d'annotations)

Lors de l'utilisation d'une variable d'instance privée, il est nécessaire de spécifier la clé JSON (nom) à mapper avec @ JsonProperty.

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);

Exemple de sortie.

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

Lorsqu'une variable d'instance privée et une méthode d'accès sont préparées dans la classe (à l'aide d'annotations)

Si vous rendez la méthode d'accesseur un peu plus ferme, elle sera plus facile à utiliser à partir de classes externes.

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);

Exemple de sortie.

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

Lorsqu'une classe pour le mappage est préparée (à l'aide d'annotations)

Préparez une classe et une classe interne pour le mappage des données JSON.

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);

Exemple de sortie.

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

Environnement de fichier et d'exécution utilisé pour ce contrôle d'opération

Java et 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"

Liste des fichiers

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

pom.xml

Préparez un fichier pom.xml afin qu'il puisse être construit et exécuté par Maven. Ajoutez les bibliothèques Jackson jackson-core, jackson-databind, jackson-annotations aux dépendances. Ajoutez exec-maven-plugin aux plugins afin de pouvoir exécuter des programmes Java à partir de Maven.

<?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>

Une commande pour générer un fichier JAR.

$ mvn package

Une commande pour exécuter l'exemple de programme.

$ mvn exec:java

Code source Java

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"]
  }
}

Matériel de référence

Recommended Posts

Analyser et objectiver JSON à l'aide de l'annotation @JsonProperty de la bibliothèque Java Jackson
[Java] Essayez de modifier les éléments de la chaîne Json à l'aide de la bibliothèque
Convertir JSON et YAML en Java (en utilisant Jackson et SnakeYAML)
JSON en Java et Jackson Partie 1 Renvoyer JSON à partir du serveur
Afficher le calendrier et le jour japonais en utilisant la classe standard java8
[Java] Affiche le résultat de ffprobe -show_streams dans JSON et mappe-le à un objet dans Jackson
J'ai comparé les caractéristiques de Java et .NET
JSON avec Java et Jackson Part 2 XSS mesures
Convertir l'énumération Java et JSON vers et depuis Jackson
Veuillez noter la division (division) de java kotlin Int et Int
La comparaison d'énumération est ==, et equals est bonne [Java]
[Java] Trier la liste à l'aide de flux et d'expressions lambda
Essayez d'implémenter le tamis Eratostenes en utilisant la bibliothèque standard de Java
Organiser l'état actuel de Java et envisager l'avenir
Langage Java du point de vue de Kotlin et C #
J'ai résumé les types et les bases des exceptions Java
Essayez le hooking global en Java à l'aide de la bibliothèque JNativeHook
[Java] Convertir JSON en Java et Java en JSON-Comment utiliser GSON et Jackson-
Conversion entre objets Java et JSON à l'aide de Moshi
[Java10] Veillez à utiliser ensemble var et génériques
Histoire des annotations Java
Envoi et réception de messages simples à l'aide du composant Kafka du framework Apache Camel (édition Java DSL)
[Note] Sortie Java de la somme des éléments pairs et impairs
Je n'ai pas vraiment compris le comportement de Java Scanner et .nextLine ()
J'ai essayé de résumer les bases de kotlin et java
[Java] Méthode de comparaison de chaînes de caractères et méthode de comparaison utilisant des expressions régulières
Commande pour vérifier le nombre et l'état des threads Java
Vérifiez l'état des applications Java sans utiliser d'outils de surveillance
Les débutants en Java ont brièvement résumé le comportement de Array et ArrayList
[Java] [jackson] Correspond à la virgule de fin (virgule de fin) lors de l'analyse de JSON.
L'histoire de la transmission de Java à Heroku à l'aide du pipeline BitBucket
J'ai essayé d'utiliser la bibliothèque CameraX avec Android Java Fragment
[Java] J'ai réfléchi aux mérites et aux utilisations de "interface"
Défis et recherche alternative de la bibliothèque de communication série Java RXTX
[Java] Communication JSON avec jackson
[Java] Création d'annotations originales
Avantages et inconvénients de Java
[Java] Divers résumés joints aux chefs de classe et aux membres
[Java] Obtenez les dates des derniers lundi et dimanche dans l'ordre
Java, JS (jQuery) et Ajax. Obtenez une valeur spécifique de JSON.
Lire les 4 premiers octets du fichier de classe Java et générer CAFEBABE
De Java naissant (3 ans) à Node.js (4 ans). Et l'impression de retourner à Java
J'ai essayé de résumer les méthodes de Java String et StringBuilder
[Android] Convertissez Map en JSON à l'aide de GSON avec Kotlin et Java
La version d'Elasticsearch que vous utilisez est-elle compatible avec Java 11?