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