Json - Java对象到Json

时间:2012-06-12 17:11:12

标签: java json java-ee

我是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”
     }
 }

6 个答案:

答案 0 :(得分:9)

注意:我是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绑定如何不需要任何编译时依赖性。 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);
    }

}

<强> input.json /输出

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

答案 1 :(得分:6)

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

答案 2 :(得分:5)

jackson也非常快速且易于使用

答案 3 :(得分:1)

虽然关闭,this SO post可以帮助您了解杰克逊和GSON之间的差异。哪一个是“最好的”取决于什么对你很重要。

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

答案 4 :(得分: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"}

答案 5 :(得分: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>

此依赖项将向以下类路径传递以下库: 杰克逊注释2.9.4.jar 杰克逊核心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"
   }
  }
}

注意:请注意,使用@son这样的Json批注来使json属性名称与预期输出相同,而@JsonPropertyOrder({“ Name”,“ Email”}则保持序列与预期输出。请参考:https://www.baeldung.com/jackson-annotations