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”
     }
 }
4

6 回答 6

9

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


我应该如何构建我的 Java 对象?

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

我的结果

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 绑定如何不需要任何编译时依赖项。Java SE 6 中提供了所有必要的 API。如果您使用的是 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);
    }

}

输入.json/输出

{
   "MyResult" : {
      "AccountID" : "12345",
      "User" : {
         "Name" : "blah blah",
         "Email" : "blah@blah.com"
      },
      "Result" : {
         "Course" : "blah",
         "Score" : "10.0"
      }
   }
}
于 2012-06-14T20:56:01.663 回答
7

Google 的 GSON是一个非常好的 json 库。是来自上一个链接,它基本上概述了它的一些功能。

于 2012-06-12T17:13:26.760 回答
5

jackson也非常快速且易于使用

于 2012-06-12T17:16:01.533 回答
1

虽然已关闭,但这篇 SO 帖子可以帮助您了解 Jackson 和 GSON 之间的区别。哪一个是“最好的”取决于对你来说什么是重要的。

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

于 2012-06-12T17:18:37.927 回答
1

GSON

超级简单(无需获取器/设置器,无需注释或配置)。

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"}
于 2013-11-19T20:22:42.197 回答
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

**注意:请始终使用最新的罐子。

我应该如何构建我的 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 。

于 2019-01-02T04:25:26.063 回答