Jackson使用具体的Java对象和类型强制转换到JSON使用

2019-05-09 23:30|来源: 网路

在简单的数据绑定中,我们使用String作为关键对象,并作为一个值对象映射类。相反,我们可以使用具体的Java对象和类型强制转换到JSON使用。

考虑下面的例子使用一个类的UserData来保存用户专用数据。

创建一个名为JacksonTester在Java类文件目录 C:\>Jackson_WORKSPACE.

文件名: JacksonTester.java

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;

public class JacksonTester {
   public static void main(String args[]){
      JacksonTester tester = new JacksonTester();
         try {
            ObjectMapper mapper = new ObjectMapper();

            Map userDataMap = new HashMap();
            UserData studentData = new UserData(); 
            int[] marks = {1,2,3};

            Student student = new Student();
            student.setAge(10);
            student.setName("Mahesh");
            // JAVA Object
            studentData.setStudent(student);
            // JAVA String
            studentData.setName("Mahesh Kumar");
            // JAVA Boolean
            studentData.setVerified(Boolean.FALSE);
            // Array
            studentData.setMarks(marks);
            TypeReference ref = new TypeReference>() { };
            userDataMap.put("studentData1", studentData);
            mapper.writeValue(new File("student.json"), userDataMap);
            //{
            //   "studentData1":
            //	 {
            //		"student":
            //		{
            //			"name":"Mahesh",
            //			"age":10
            //      },
            //      "name":"Mahesh Kumar",
            //      "verified":false,
            //      "marks":[1,2,3]
            //   }
            //}
            userDataMap = mapper.readValue(new File("student.json"), ref);

            System.out.println(userDataMap.get("studentData1").getStudent());
            System.out.println(userDataMap.get("studentData1").getName());
            System.out.println(userDataMap.get("studentData1").getVerified());
            System.out.println(Arrays.toString(userDataMap.get("studentData1").getMarks()));
      } catch (JsonParseException e) {
         e.printStackTrace();
      } catch (JsonMappingException e) {
         e.printStackTrace();
      } catch (IOException e) {
            e.printStackTrace();
      }
   }
}

class Student {
   private String name;
   private int age;
   public Student(){}
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public String toString(){
      return "Student [ name: "+name+", age: "+ age+ " ]";
   }	
}

class UserData {
   private Student student;
   private String name;
   private Boolean verified;
   private int[] marks;

   public UserData(){}

   public Student getStudent() {
      return student;
   }
   public void setStudent(Student student) {
      this.student = student;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public Boolean getVerified() {
      return verified;
   }
   public void setVerified(Boolean verified) {
      this.verified = verified;
   }
   public int[] getMarks() {
      return marks;
   }
   public void setMarks(int[] marks) {
      this.marks = marks;
   }		
}

验证输出

使用javac编译如下类:

C:\Jackson_WORKSPACE>javac JacksonTester.java

现在运行jacksonTester看到的结果:

C:\Jackson_WORKSPACE>java JacksonTester

验证输出

Student [ name: Mahesh, age: 10 ]
Mahesh Kumar
false
[1, 2, 3]


相关问答

更多

使用Jackson JSON解析Spring MVC中的JSON(Parsing JSON in Spring MVC using Jackson JSON)

使用像Jackson这样的映射技术的关键是你可以使用Objects(你不必自己解析JSON)。 定义一个Java类,类似于您期待的JSON。 例如这个JSON: { "foo" : ["abc","one","two","three"], "bar" : "true", "baz" : "1" } 可以映射到这个类: public class Fizzle{ private List<String> foo; private boolean bar; private in ...

无法使用jackson API将json字符串映射到java对象(Unable to map json string to java object using jackson API)

您正在使用JAXB注释,因此您需要使用正确的模块正确配置ObjectMapper ; 你需要jackson-module-jaxb-annotations项目。 使用您喜欢的依赖管理系统添加它,并像这样使用它: JaxbAnnotationModule module = new JaxbAnnotationModule(); // configure as necessary objectMapper.registerModule(module); 注意:这是针对Jackson 2.x. Jac ...

使用jackson将POJO与变量名称中的斜杠转换为JSON转换(POJO with slash in variable name conversion to JSON conversion using jackson)

尝试注释,例如 @JsonProperty("page/pages") public String pages; Try an annotation e.g. @JsonProperty("page/pages") public String pages;

Jackson Hibernate Spring使用外键返回JSON而不是对象(Jackson Hibernate Spring returns JSON with foreign key not object)

杰克逊仅为该对象的第一次出现编写整个对象的原因是我用于处理循环对象图的@JsonIdentityInfo注释。 The reason Jackson wrote the whole object only for the first appearance of that object is @JsonIdentityInfo annotation which I used for handling cyclic object graphs.

在XStream中,有一种更好的方法可以在JSON和Java中对对象进行编组/解组(In XStream is there a better way to marshall/unmarshall List's in JSON and Java)
我同意XStream不太适合 - 这是一个OXM(对象/ Xml映射器),JSON作为使用XML处理路径的辅助输出格式处理。 这就是为什么需要“约定”(如何将层次结构xml模型转换为json的对象图模型,反之亦然); 你的选择归结为使用最不利于次优选择的任何东西。 如果XML是您的主要数据格式,那就好了,您只需要一些基本的JSON(类似)支持。 为了获得良好的JSON支持,我会考虑使用一个JSON处理库来实现真正的OJM映射(我还假设Svenson也是如此),比如: 杰克逊 谷歌,GSON 另外: ...