Json - 将Java对象转换为Json

6

我对Json非常陌生,我的目标是从Java bean中创建下面的Json输出。我应该如何构造我的Java对象? 我应该有一个MyResult类和User和Result作为子类吗? 什么Json库可以用于此?

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

谢谢您的回复。如果我要在Jackson中设计它,我的Java对象应该是什么样子? - user238021
6个回答

10

注意:我是EclipseLink JAXB (MOXy)的负责人,也是JAXB (JSR-222)专家组的成员。


如何构建我的Java对象?

以下是您的对象模型示例。MOXy的JSON绑定利用JAXB注释将域模型映射到JSON,因此我也包括了这些注释。JAXB实现具有默认规则来映射字段/属性名称,但由于您的文档不同于默认值,每个字段都必须进行注释。

MyResult

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;

}

用户

package forum11001458;

import javax.xml.bind.annotation.XmlElement;

public class User {

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

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

}

结果

package forum11001458;

import javax.xml.bind.annotation.XmlElement;

public class Result {

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

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

}

我应该使用哪个Json库?

以下是如何使用MOXy进行JSON绑定的方法:

jaxb.properties

要使用MOXy作为您的JAXB提供程序,您需要在与域模型相同的包中包含一个名为jaxb.properties的文件,并包含以下条目:

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

演示

请注意,MOXy的JSON绑定不需要任何编译时依赖项。 所有必要的API都可在Java SE 6中使用。 如果您使用的是Java SE 5,则可以添加必要的支持API。

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

}

input.json/Output

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

7

Google's GSON是一个非常好用的json库。 这个链接是上面那个链接里面提到的,它基本上概述了一些GSON的功能。


5

jackson 也很快速和易于使用


谢谢您的回复。如果我要用Jackson来设计它,我的Java对象应该长什么样? - user238021

1

尽管已经关闭,这篇SO帖子可以帮助您了解Jackson和GSON之间的区别。哪一个是“最好的”取决于您认为什么最重要。

编辑:特别是对于Jackson而言,您的示例看起来很像他们所谓的完整数据绑定的示例,您可以在这里阅读它。顺便说一句,虽然宣布需要5分钟阅读该文档可能有点短,但它提供了Jackson可以使用的不同方式的完整概述。您还会注意到,给出的示例不使用注释。


1

或者GSON

超级简单(不需要getter/setter,不需要注解或配置)。

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

我现在明白了,@fvu说的也是一样的。无论如何。 - ses

0

我可以使用哪个Json库? Jackson库用于将Java对象序列化为JSON并将JSON字符串反序列化为Java对象。在pom.xml中添加以下依赖项。

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

这个依赖项将自动将以下库添加到类路径中:

  • jackson-annotations-2.9.4.jar
  • jackson-core-2.9.4.jar
  • jackson-databind-2.9.4.jar

**注意:请始终使用最新的jar包。

我应该如何构建我的Java对象? 请参阅完整的工作代码。

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

注意:请注意使用Json注释,如@JsonProperty("Email"),以使JSON属性名称与期望输出中的名称相同,并使用@JsonPropertyOrder({"Name","Email"})保持与期望输出中的顺序相同。 参考https://www.baeldung.com/jackson-annotations

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接