Json - Objeto Java a Json

Soy muy nuevo en Json y mi objetivo es crear la salida Json a continuación desde Java bean. ¿Cómo debo estructurar mi objeto Java? ¿Debo tener la clase MyResult y User y Result como subclases? ¿Qué biblioteca Json puedo usar para esto?

“MyResult” {
    “AccountID”: “12345”,
    "User" {
        "Name": "blah blah",
        "Email": “blah@blah.com”,
     },
     "Result" {
         "Course": “blah”,
         "Score": “10.0”
     }
 }

preguntado el 12 de junio de 12 a las 18:06

Gracias por la respuesta. Si tuviera que diseñar esto en Jackson, ¿cómo debería verse mi objeto Java? -

6 Respuestas

Nota: Soy el EclipseLink JAXB (MOXy) líder y miembro de la JAXB (JSR-222) grupo de expertos.


¿Cómo debo estructurar mi objeto Java?

A continuación se muestra el aspecto que podría tener su modelo de objetos. El enlace JSON de MOXy aprovecha las anotaciones JAXB para mapear el modelo de dominio a JSON, por lo que también las he incluido. Las implementaciones de JAXB tienen reglas predeterminadas para asignar nombres de campo/propiedad, pero dado que su documento difiere del predeterminado, cada campo debe anotarse.

MiResultado

package forum11001458;

import javax.xml.bind.annotation.*;

@XmlRootElement(name="MyResult")
public class MyResult {

    @XmlElement(name="AccountID")
    private String accountID;

    @XmlElement(name="User")
    private User user;

    @XmlElement(name="Result")
    private Result result;

}

Usuario

package forum11001458;

import javax.xml.bind.annotation.XmlElement;

public class User {

    @XmlElement(name="Name")
    private String name;

    @XmlElement(name="Email")
    private String email;

}

Resultado

package forum11001458;

import javax.xml.bind.annotation.XmlElement;

public class Result {

    @XmlElement(name="Course")
    private String course;

    @XmlElement(name="Score")
    private String score;

}

¿Qué biblioteca Json puedo usar para esto?

A continuación se muestra cómo puede usar MOXy para hacer el enlace JSON:

jaxb.propiedades

Para usar MOXy como su proveedor JAXB, debe incluir un archivo llamado jaxb.properties con la siguiente entrada en el mismo paquete que su modelo de dominio:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

Demo

Tenga en cuenta que el enlace JSON de MOXy no requiere dependencias de tiempo de compilación. Todas las API necesarias están disponibles en Java SE 6. Puede agregar las API de soporte necesarias si está utilizando Java SE 5.

package forum11001458;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(MyResult.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        unmarshaller.setProperty("eclipselink.media-type", "application/json");
        File json = new File("src/forum11001458/input.json");
        Object myResult = unmarshaller.unmarshal(json);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty("eclipselink.media-type", "application/json");
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(myResult, System.out);
    }

}

entrada.json/Salida

{
   "MyResult" : {
      "AccountID" : "12345",
      "User" : {
         "Name" : "blah blah",
         "Email" : "blah@blah.com"
      },
      "Result" : {
         "Course" : "blah",
         "Score" : "10.0"
      }
   }
}

Respondido el 14 de junio de 12 a las 21:06

GSON de Google es un json lib realmente agradable. Este planteamiento de « es del enlace anterior y básicamente describe algunas de sus funciones.

Respondido el 12 de junio de 12 a las 18:06

jackson también es bastante rápido y fácil de usar

Respondido el 12 de junio de 12 a las 18:06

Gracias por la respuesta. Si tuviera que diseñar esto en Jackson, ¿cómo debería verse mi objeto Java? - user238021

Aunque cerrado, esta SO publicación puede ayudarlo a comprender las diferencias entre Jackson y GSON. Cuál es el "mejor" depende de lo que sea importante para usted.

EDITAR: Específicamente para Jackson, su ejemplo se parece mucho al ejemplo que dan para lo que llaman Enlace de datos completo, puede leerlo aquí. Por cierto, aunque los 5 minutos anunciados que se necesitan para leer ese documento son quizás un poco cortos, brinda una descripción completa de las diferentes formas en que se puede usar Jackson. También notará que los ejemplos dados no usan anotaciones.

contestado el 23 de mayo de 17 a las 11:05

Or GSON

Súper fácil (sin getters/settres, no se necesitan anotaciones ni configuraciones).

class BagOfPrimitives {
  private int value1 = 1;
  private String value2 = "abc";
  private transient int value3 = 3;
}

BagOfPrimitives obj = new BagOfPrimitives();
Gson gson = new Gson();
String json = gson.toJson(obj); 

==> json is {"value1":1,"value2":"abc"}

respondido 19 nov., 13:20

Ahora veo, @fvu dijo más o menos lo mismo. de todos modos. - ses

¿Qué biblioteca Json puedo usar para esto? Jackson Library se utiliza para serializar objetos Java en JSON y deserializar cadenas JSON en objetos Java. Agregue las siguientes dependencias a pom.xml.

   <dependency>
     <groupId>com.fasterxml.jackson.core</groupId>
     <artifactId>jackson-databind</artifactId>
     <version>2.9.4</version> 
     </dependency>

Esta dependencia agregará transitivamente las siguientes bibliotecas al classpath: jackson-annotations-2.9.4.jar jackson-core-2.9.4.jar jackson-databind-2.9.4.jar

**Nota: Por favor, vaya siempre con los últimos frascos.

¿Cómo debo estructurar mi objeto Java? Por favor, vea el código de trabajo completo.

  **MainClass.java:**

      import java.io.IOException;

     import com.fasterxml.jackson.databind.ObjectMapper;
     import com.fasterxml.jackson.databind.SerializationFeature;

    public class MainClass {

    public static void main(String[] args) throws IOException {

    ObjectMapper mapper = new ObjectMapper();
    mapper.enable(SerializationFeature.INDENT_OUTPUT);

    Result result = new Result();
    result.setCourse("blah");
    result.setScore("10.0");

    User user = new User();
    user.setName("blah blah");
    user.setEmail("blah@blah.com");

    MyResult myResult = new MyResult();
    myResult.setAccountID("12345");
    myResult.setResult(result);
    myResult.setUser(user);

    MyPojo myPojo = new MyPojo();
    myPojo.setMyResult(myResult);

    String jsonStr = mapper.writeValueAsString(myPojo);

    System.out.println(jsonStr);

} }

     **MyPojo.java:-**


    import com.fasterxml.jackson.annotation.JsonProperty;
    import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonPropertyOrder({ "AccountID", "User", "Result" })
public class MyPojo {
private MyResult MyResult;

public MyResult getMyResult() {
    return MyResult;
}

@JsonProperty("MyResult")
public void setMyResult(MyResult MyResult) {
    this.MyResult = MyResult;
} }


    **MyResult.java:**

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonPropertyOrder({ "AccountID", "User", "Result" })
public class MyResult {

private User User;

private Result Result;

private String AccountID;

public User getUser() {
    return User;
}

@JsonProperty("User")
public void setUser(User User) {
    this.User = User;
}

public Result getResult() {
    return Result;
}

@JsonProperty("Result")
public void setResult(Result Result) {
    this.Result = Result;
}

public String getAccountID() {
    return AccountID;
}

  @JsonProperty("AccountID")
  public void setAccountID(String AccountID) {
    this.AccountID = AccountID;
    } }


    **Result.java:**

 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;

   @JsonPropertyOrder({ "Course", "Score" })
    public class Result {

    private String Course;

    private String Score;

    public String getCourse() {
    return Course;
    }

    @JsonProperty("Course")
    public void setCourse(String Course) {
    this.Course = Course;
}

   public String getScore() {
    return Score;
}

   @JsonProperty("Score")
  public void setScore(String Score) {
    this.Score = Score;
  } }


    **User.java:**

    import com.fasterxml.jackson.annotation.JsonProperty;
    import com.fasterxml.jackson.annotation.JsonPropertyOrder;

    @JsonPropertyOrder({ "Name", "Email" })
      public class User {

    private String Name;

    private String Email;

    public String getName() {
    return Name;
    }

@JsonProperty("Name")
public void setName(String Name) {
    this.Name = Name;
}

public String getEmail() {
    return Email;
}

@JsonProperty("Email")
public void setEmail(String Email) {
    this.Email = Email;
}

@Override
public String toString() {
    return "ClassPojo [Name = " + Name + ", Email = " + Email + "]";
} }

   **Result:**

      {
  "MyResult" : {
    "AccountID" : "12345",
   "User" : {
     "Name" : "blah blah",
     "Email" : "blah@blah.com"
   },
   "Result" : {
     "Course" : "blah",
     "Score" : "10.0"
   }
  }
}

Nota: tenga en cuenta el uso de anotaciones Json como @JsonProperty("Correo electrónico") para hacer que los nombres de propiedades json sean iguales en el resultado esperado y @JsonPropertyOrder({ "Nombre", "Correo electrónico" } para mantener la secuencia como en el resultado esperado. Referir: https://www.baeldung.com/jackson-annotations.

Respondido el 02 de enero de 19 a las 04:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.