Boon-ObjectMapper
一旦安装了Boon,就可以使用BoonObjectMapper
类开始将JSON解析为对象。
BoonObjectMapper
类设计为具有类似于GSON和Hymanson Hymanson ObjectMapper类的接口。这使得从GSON或者Hymanson切换到Boon更加容易。
创建一个ObjectMapper
在使用BoonObjectMapper
之前,必须首先创建它的实例。我们可以通过JsonFactory的静态create()方法来实现。这是一个如何用Java代码创建BoonObjectMapper
的示例:
ObjectMapper mapper = JsonFactory.create();
将JSON解析为对象
BoonObjectMapper
可以将JSON解析为对象图。这是使用BoonObjectMapper
将JSON解析为对象图的示例:
String fleetStr = "{" + " \"cars\" : [" + " { \"brand\" : \"Audi\", \"doors\" : 4 }" + " ,{ \"brand\" : \"Mercedes\", \"doors\" : 3}" + " ,{ \"brand\" : \"BMW\", \"doors\" : 2 }" + " ]" + "}"; ObjectMapper mapper = JsonFactory.create(); Fleet fleet = mapper.readValue(fleetStr, Fleet.class);
"车队"和"汽车"类如下所示:
public class Fleet { public Car[] cars = null; }
public class Car { public String brand = null; public int doors = 0; public Car() {} public Car(String brand, int doors) { this.brand = brand; this.doors = doors; } }
请注意,该示例称为" ObjectMapper"类的" readValue()"方法。该方法的名称和参数与Hyman逊的" ObjectMapper"的名称和参数相似。
Boon还有一个fromJson()
方法,它与readValue()
方法一样,但是看起来更像是GSON接口。这是使用fromJson()
方法的相同示例:
String fleetStr = "{" + " \"cars\" : [" + " { \"brand\" : \"Audi\", \"doors\" : 4 }" + " ,{ \"brand\" : \"Mercedes\", \"doors\" : 3}" + " ,{ \"brand\" : \"BMW\", \"doors\" : 2 }" + " ]" + "}"; ObjectMapper mapper = JsonFactory.create(); Fleet fleet = mapper.fromJson(fleetStr, Fleet.class);
如果我们使用的是Hymanson或者GSON,则切换到Boon会更容易,因为Boon包含的方法与我们以前使用GSON或者Hymanson的方法相似。请记住,它们是相似的,但不完全相同。在抛出的异常,参数等方面存在细微的差异。不过,我们将很快克服这些细微的差异。
将JSON解析为Map
有时,将JSON对象解析为" Map"要比创建自定义类来保存解析后的JSON更容易。 Boon可以很容易地做到这一点。我们要做的就是将Map.class作为第二个参数传递给readValue()方法(或者fromJson()方法)。以下是使用Boon将JSON解析为" Map"的示例:
String fleetStr = "{" + " \"cars\" : [" + " { \"brand\" : \"Audi\", \"doors\" : 4 }" + " ,{ \"brand\" : \"Mercedes\", \"doors\" : 3}" + " ,{ \"brand\" : \"BMW\", \"doors\" : 2 }" + " ]" + "}"; ObjectMapper mapper = JsonFactory.create(); Fleet fleet = mapper.fromJson(fleetStr, Fleet.class); Map fleetMap = mapper.readValue(fleetStr, Map.class); List<Map> carList = (List<Map>) fleetMap.get("cars"); for(Map carMap : carList){ String brand = (String) carMap.get("brand"); int doors = (Integer)carMap.get("doors"); System.out.println("brand: " + brand); System.out.println("doors: " + doors); }
从其他来源解析JSON
Boon可以从字符串以外的其他来源解析JSON。我们还可以从以下位置解析JSON:
byte
数组- char数组
文件
- Reader
- InputStream
字符串
这是一个从InputStream解析JSON的示例:
Fleet fleet = mapper.readValue( new FileInputStream("data/fleet.json"), Fleet.class);
如我们所见,InputStream作为第一个参数传递给ObjectMapper的readValue()方法,而不是本教程前面的示例中使用的JSON字符串。
如果我们想从其他来源解析JSON,请将该来源作为第一个参数传递给readValue()
方法。
从对象生成JSON
Boon还可以使用BoonObjectMapper
从对象生成JSON。我们可以通过调用BoonObjectMapper
的writeValue()
或者writeValueAsString()
方法来从对象生成JSON。
writeValueAsString()方法将一个对象作为参数,并返回一个字符串,其中包含从该对象生成的JSON。这是使用writeValueAsString()方法生成JSON的示例:
Fleet fleet = new Fleet(); fleet.cars = new Car[1]; fleet.cars[0] = new Car("Mercedes", 5);; ObjectMapper mapper = JsonFactory.create(); String json = mapper.writeValueAsString(fleet); System.out.println(json);
这个例子首先创建一个有效的Fleet对象,里面有一个Car对象。然后,它创建一个" ObjectMapper"并调用" writeValueAsString()"方法。最后,将生成的JSON打印到System.out
。从此示例生成的JSON如下所示:
{"cars":[{"brand":"Mercedes","doors":5}]}
我们还可以将生成的JSON直接写到File
,Writer
或者OutputStream
中。为此,我们需要调用writeValue()方法。这是一个如何将生成的JSON直接写到OutputStream
的示例:
mapper.writeValue( new FileOutputStream("data/output.json"), fleet);
要将生成的JSON写入文件或者写入器,只需将文件或者写入器作为第一个参数传递给writeValue()方法即可。
从Map生成JSON
Boon的ObjectMapper也可以从Map生成JSON。只需将Map实例作为第二个参数传递给writeValue()或者writeValueAsString()方法即可。这是使用writeValueAsString()方法从Map生成JSON字符串的示例:
Map car = new HashMap(); car.put("brand", "BMW"); car.put("doors", 4); List cars = new ArrayList(); cars.add(car); Map fleet = new HashMap(); fleet.put("cars", cars); ObjectMapper mapper = JsonFactory.create(); String json = mapper.writeValueAsString(fleet); System.out.println(json);
首先,该示例创建一个代表车队对象的"地图",并向其中添加一系列汽车(也由"地图"实例表示)。其次,该示例创建一个" ObjectMapper"并调用" writeValueAsString()"方法,并将舰队" Map"作为参数传递。最后,将生成的JSON字符串打印出来。该代码示例的输出为:
{"cars":[{"doors":4,"brand":"BMW"}]}
我们还可以将生成的JSON直接写到File
,Writer
或者OutputStream
中。这是一个通过调用writeValue()方法将生成的JSON写入OutputStream的示例:
mapper.writeValue( new FileOutputStream("data/output-2.json"), fleet);
要将生成的JSON写入文件或者写入器,只需将文件或者写入器作为第一个参数传递给writeValue()方法即可。
JSON中的日期格式
BoonObjectMapper
可以使用JSON中的不同日期格式。它可以使用解析并生成日期的"长"版本(自1970年1月1日以来的毫秒数),也可以使用正式的JavaScript日期格式。
首先,让我们创建一个包含Date
对象的Java类:
public class Payment { public Date paymentDate = null; }
这个"付款"类仅包含一个字段" paymentDate",它是一个java.util.Date实例。
将长解析为日期
Boon的ObjectMapper
可以将JSON中的long值解析为一个日期。这是一个代码示例,该代码示例:
String paymentJson = "{ \"paymentDate\" : 1434016456493 }"; ObjectMapper objectMapper = JsonFactory.create(); Payment payment = objectMapper.readValue(paymentJson, Payment.class);
请注意示例开头的JSON字符串。它包含一个名为" paymentDate"的字段,该值是日期的" long"表示形式(以毫秒为单位)。
当ObjectMapper解析此JSON字符串时,它将PayDate的long值转换为Date对象,因为Paying类的paymentDate字段是Date。
将日期字符串解析为日期
Boon还可以将可读的日期字符串解析为" Date"对象。这是上一节中的示例,其中日期表示为日期字符串,而不是long
毫秒值:
String paymentJson = "{ \"paymentDate\" : \"2014-06-11T12:33:00.014Z\" }"; ObjectMapper objectMapper = JsonFactory.create(); //ObjectMapper objectMapper = JsonFactory.createUseJSONDates(); Payment payment = objectMapper.readValue(paymentJson, Payment.class); System.out.println("payment.paymentDate = " + payment.paymentDate);
在JSON中生成日期字符串
默认情况下,当从对象生成JSON时," ObjectMapper"会将" Date"序列化为" long"数字(毫秒)。但是,我们可以创建ObjectMapper
的版本,而不是创建日期字符串。方法如下:
ObjectMapper objectMapper = JsonFactory.createUseJSONDates();
一旦使用了createObjectJSONDates()方法而不是JsonFactory类的create()方法创建了ObjectMapper,Date字段就会在序列化的JSON中转换为日期字符串,而不是数字。
注释
Boon包含一组注释,可用于调整JSON的解析或者生成。这些注释是:
@ JsonIgnore
@ JsonInclude
这些注释将在以下各节中说明:
@JsonIgnore
可以将@JsonIgnore批注放置在类中的字段上方。当Boon检测到@JsonIgnore时,它将忽略该字段。这是一个使用@ JsonIgnore
注释的示例类:
import org.boon.json.annotations.JsonIgnore; public class Car { public String brand = null; public int doors = 0; @JsonIgnore public String comment = "blablabla"; public Car() {} public Car(String brand, int doors) { this.brand = brand; this.doors = doors; } }
当Boon检测到添加在comment
字段上的@JsonIgnore批注时,Boon在序列化Car对象时不会序列化" comment"字段。
@JsonInclude
默认情况下,Boon会从序列化中排除为空(" null"),空列表或者具有默认值的字段(例如," 0"表示" int"," false"表示" boolean"等)。如果我们希望Boon在生成的JSON中包含此类字段,则可以在该字段中添加一个@JsonInclude批注。这是一个使用@ JsonInclude
注释的示例类:
import org.boon.json.annotations.JsonIgnore; public class Car { public String brand = null; public int doors = 0; @JsonInclude public String comment = "blablabla"; public Car() {} public Car(String brand, int doors) { this.brand = brand; this.doors = doors; } }
解析原语
Boon还可以将JSON片段解析为Java原语。例如,将字符串解析为int
或者将JSON数组解析为Java原语的数组。有时会很方便。
要使用这些原始解析函数,我们需要访问从ObjectMapper的解析器方法返回的JsonParserAndMapper。在JsonParserAndMapper
实例上,我们可以调用原始解析方法。
这是一个将字符串解析为int的示例:
ObjectMapper objectMapper = JsonFactory.create(); int intVal = objectMapper.parser().parseInt("123");
JsonParserAndMapper还可以将表示字符串或者数字数组的JSON字符串解析为原始Java类型的数组。这是显示如何将JSON数组解析为int
数组的示例:
int[] ints = objectMapper.parser() .parseIntArray("[123, 456, 789]");
类似地,JsonParserAndMapper
可以将代表对象的JSON字符串解析为JavaMap
,如下所示:
String jsonMap = "{ \"key1\" : \"val1\", \"key2\" : \"val2\" }"; Map<String, Object> map = objectMapper.parser().parseMap(jsonMap);
JsonParserAndMapper具有更多可以将JSON字符串和片段解析为原始Java类型的方法。