Boon-ObjectMapper

时间:2020-01-09 10:36:11  来源:igfitidea点击:

一旦安装了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。我们可以通过调用BoonObjectMapperwriteValue()或者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直接写到FileWriter或者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直接写到FileWriter或者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类型的方法。