Jackson ObjectMapper实现JSON实际的读/写

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

ObjectMapper类是Jackson库的主要类。它提供一些功能将转换成Java对象匹配JSON结构,反之亦然。它使用JsonParser和JsonGenerator的实例实现JSON实际的读/写。

类声明

以下是org.codehaus.jackson.map.ObjectMapper类的声明:

public class ObjectMapper
   extends ObjectCodec
      implements Versioned

嵌套类

S.N. 类 & 描述
1 static class ObjectMapper.DefaultTypeResolverBuilder
定制TypeResolverBuilder,提供所谓的“默认输入”使用类型解析构建器(见enableDefaultTyping()了解详细信息)。
2 static class ObjectMapper.DefaultTyping
使用enableDefaultTyping()枚举指定什么样的类型(类)默认输入应该使用。

构造函数

S.N. 构造函数 & 描述
1 ObjectMapper()
默认的构造函数,这将构建默认JsonFactory必要时使用StdSerializerProvider作为其SerializerProvider,并BeanSerializerFactory作为其SerializerFactory。
2 ObjectMapper(JsonFactory jf)
构造使用指定的JsonFactory构建必要的JsonParsers和/或JsonGenerators映射。
3 ObjectMapper(JsonFactory jf, SerializerProvider sp, DeserializerProvider dp)
4 ObjectMapper(JsonFactory jf, SerializerProvider sp, DeserializerProvider dp, SerializationConfig sconfig, DeserializationConfig dconfig)
5 ObjectMapper(SerializerFactory sf)
不推荐使用。使用其他构造来代替; 注意,可以设置序列化工厂setSerializerFactory(org.codehaus.jackson.map.SerializerFactory)

继承的方法

这个类继承了以下类方法:

  • java.lang.Object

ObjectMapper示例

选择使用任何编辑器创建以下java程序在 C:/> Jackson_WORKSPACE

File: JacksonTester.java

import java.io.IOException;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;

public class JacksonTester {
   public static void main(String args[]){
      ObjectMapper mapper = new ObjectMapper();
      String jsonString = "{\"name\":\"Mahesh\", \"age\":21}";

      //map json to student
      try {
         Student student = mapper.readValue(jsonString, Student.class);
         System.out.println(student);
         mapper.enable(SerializationConfig.Feature.INDENT_OUTPUT);
         jsonString = mapper.writeValueAsString(student);
         System.out.println(jsonString);

      } 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+ " ]";
   }	
}


验证结果

使用 javac 编译如下类:

C:\Jackson_WORKSPACE>javac JacksonTester.java

现在运行jacksonTester看到的结果:

C:\Jackson_WORKSPACE>java JacksonTester

验证输出

Student [ name: Mahesh, age: 21 ]
{
  "name" : "Mahesh",
  "age" : 21
}


相关问答

更多

Jackson UnrecognizedPropertyException(Jackson UnrecognizedPropertyException)

这里的问题是OP混合了两种不同的Jackson版本: 1.9来自org.codehaus ( org.codehaus.jackson.map.exc.UnrecognizedPropertyException显示) 来自com.fasterxml 2.x(在进口import com.fasterxml.jackson.annotation.可见import com.fasterxml.jackson.annotation. ) 正如山姆在评论中指出的那样,OP应该只使用一个版本。 使用2.x进行 ...

Java - Jackson JSON Library和ObjectMapper.readValue(Java - Jackson JSON Library and ObjectMapper.readValue)

您可以创建一个类来映射患者; private static class Patient { @JsonProperty("name") private String name; @JsonProperty("age") private int age; public Patient() { } public String getName() { return name; } public int getAge() ...

在Custom Class中使用Jackson的ObjectMapper(Using Jackson's ObjectMapper inside Custom Class)

当然,但你需要让它忽略jsonString属性,以避免无休止的递归调用。 将@JsonIgnore添加到getter。 或者命名你的方法,使它不再是属性,例如toJson() (这也是一个更好的名字,IMO)。 也就是说,每次创建一个新的ObjectMapper都不是一个好主意。 相反,你应该重复使用同一个,一劳永逸地构建。 Sure, but you need to make it ignore the jsonString property, to avoid that endless rec ...

如何在Jackson 2.7+上为ObjectMapper设置命名策略?(How to set naming strategy to ObjectMapper on Jackson 2.7+?)

事实证明,Lombok注释@AllArgsConstructor导致了这个问题。 在GitHub上报告了一个相关问题 。 这似乎是杰克逊的一个错误。 它可以在2.7.0和2.7.1版本中重现。 It turned out that the Lombok annotation @AllArgsConstructor caused the problem. There's a related issue reported on GitHub. It seems like a bug of Jackso ...

如何正确和线程安全重用Jackson ObjectReader?(How correctly and thread safe reuse Jackson ObjectReader?)

文档说它是“完全线程安全的”,这意味着你可以安全地使用parseJson2而不必担心在并发线程中调用这个方法。 https://fasterxml.github.io/jackson-databind/javadoc/2.5/com/fasterxml/jackson/databind/ObjectReader.html 使用“流畅”(或类型,构建器)模式,以便实例是不可变的(因此完全线程安全,没有外部同步); 为不同的配置构建新实例。 实例最初由ObjectMapper构造,可以重用,共享,缓存 ...