1. 程式人生 > >Jackson資料處理及繫結

Jackson資料處理及繫結

獲取

Maven的

該軟體包的功能包含在Java包中com.fasterxml.jackson.databind,可以使用以下Maven依賴項來使用:

< properties >
  ...
  <! -儘可能使用最新版本。- > < jackson .version> 2.9.7 </ jackson .version> ... </ properties >  < dependencies > ... < 依賴 > < groupId > com.fasterxml.jackson.core </ 
groupId > < artifactId > jackson-databind </ artifactId > < version > $ {jackson.version} </ version > </ dependency > ... </ dependencies >

由於包依賴於jackson-corejackson-annotations包,因此如果不使用Maven,則需要下載這些包; 並且您可能還希望將它們新增為Maven依賴項以確保使用相容版本。如果是這樣,還要新增:

< 
dependencies > ... < dependency > <! -注意:core-annotations版本xy0通常與 版本xy1,xy2等相容(相同)- > < groupId > com.fasterxml.jackson.core </ groupId > < artifactId > jackson-annotations </ artifactId > < version > $ {jackson.version} </ version > </ dependency
> < 依賴 > < groupId > com.fasterxml.jackson.core </ groupId > < artifactId > jackson-core </ artifactId > < version > $ {jackson.version} </ version > </ dependency > ... < dependencies >

但請注意,這是可選的,只有在jackson核心依賴關係通過傳遞依賴關係存在衝突時才有必要。

非Maven的

對於非Maven用例,您可以從Central Maven儲存庫下載jar 

Databind jar也是一個功能性的OSGi包,具有適當的匯入/匯出宣告,因此它可以在OSGi容器上使用。


使用

可以從Jackson-docs儲存庫中找到更全面的文件以及來自此專案的Wiki但這裡有簡要的介紹性教程,建議閱讀順序。

1分鐘教程:POJO到JSON並返回

最常見的用法是使用JSON,並從中構造一個Plain Old Java Object(“POJO”)。那麼讓我們從那裡開始。簡單的2屬性POJO像這樣:

//注意:也可以使用getter / setter; 這裡我們直接使用公共欄位:
public  class  MyValue {  public  String name; 公共 INT年齡; //注意:如果使用getter / setter,可以保留欄位`protected`或`private` }

我們需要一個com.fasterxml.jackson.databind.ObjectMapper用於所有資料繫結例項,所以讓我們構造一個:

ObjectMapper mapper =  new  ObjectMapper(); //建立一次,重用

預設例項適合我們使用 - 稍後我們將瞭解如何在必要時配置對映器例項。用法很簡單:

MyValue value = mapper.readValue(new File("data.json"), MyValue.class);
// or:
value = mapper.readValue(new URL("http://some.com/api/entry.json"), MyValue.class);
// or:
value = mapper.readValue("{\"name\":\"Bob\", \"age\":13}", MyValue.class);

如果我們想寫JSON,我們會反過來:

mapper.writeValue(new File("result.json"), myResultObject);
// or:
byte[] jsonBytes = mapper.writeValueAsBytes(myResultObject);
// or:
String jsonString = mapper.writeValueAsString(myResultObject);

到現在為止還挺好?

3分鐘教程:通用集合,樹模型

除了處理簡單的Bean風格的POJO之外,您還可以處理JDK ListMaps:

Map<String, Integer> scoreByName = mapper.readValue(jsonSource, Map.class);
List<String> names = mapper.readValue(jsonSource, List.class);

// and can obviously write out as well
mapper.writeValue(new File("names.json"), names);

只要JSON結構匹配,型別就很簡單。如果您有POJO值,則需要指明實際型別(注意:對於具有Listetc型別的POJO屬性,這不是必需的):

Map<String, ResultValue> results = mapper.readValue(jsonSource,
   new TypeReference<Map<String, ResultValue>>() { } );
// why extra work? Java Type Erasure will prevent type detection otherwise

(注意:無論通用型別如何,序列化都不需要額外的工作)

可是等等!還有更多!

雖然處理Maps,Lists和其他“簡單”物件型別(字串,數字,布林值)可能很簡單,但物件遍歷可能很麻煩。這就是Jackson's Tree模型可以派上用場的地方:

//可以讀作通用的JsonNode,如果它可以是Object或Array; 或者,
//如果已知為Object,則為ObjectNode,如果是array,ArrayNode等:
ObjectNode root = mapper.readTree("stuff.json");
String name = root.get("name").asText();
int age = root.get("age").asInt();
//也可以修改:這會將子物件新增為屬性'other',設定屬性'root.with("other").put("type", "student");
String json = mapper.writeValueAsString(root);
//與上面一樣,我們最終得到像'json'字串:// {
//   "name" : "Bob", "age" : 13,
//   "other" : {
//      "type" : "student"
//   }
// }

樹模型比資料繫結更方便,特別是在結構高度動態或不能很好地對映到Java類的情況下。

5分鐘教程:流解析器,生成器

資料繫結(往/來自POJO)可以方便; 並且像Tree模型一樣靈活,還有一個可用的規範處理模型:增量(又稱“流”)模型。它是資料繫結和樹模型都構建的底層處理模型,但它也向需要最終效能和/或控制解析或生成細節的使用者公開。

有關深入解釋,請檢視Jackson Core元件但是,讓我們看一個簡單的預告片,以激發你的胃口。

JsonFactory f = mapper.getFactory(); // may alternatively construct directly too

// First: write simple JSON output
File jsonFile = new File("test.json");
JsonGenerator g = f.createGenerator(jsonFile);
// write JSON: { "message" : "Hello world!" }
g.writeStartObject();
g.writeStringField("message", "Hello world!");
g.writeEndObject();
g.close();

// Second: read file back
JsonParser p = f.createParser(jsonFile);

JsonToken t = p.nextToken(); // Should be JsonToken.START_OBJECT
t = p.nextToken(); // JsonToken.FIELD_NAME
if ((t != JsonToken.FIELD_NAME) || !"message".equals(p.getCurrentName())) {
   // handle error
}
t = p.nextToken();
if (t != JsonToken.VALUE_STRING) {
   // similarly
}
String msg = p.getText();
System.out.printf("My message to you is: %s!\n", msg);
p.close();

10分鐘教程:配置

您可能會使用兩種入門級配置機制: 功能註釋

常用功能

以下是您最有可能需要了解的配置功能示例。

讓我們從更高級別的資料繫結配置開始。

// SerializationFeature用於更改JSON的編寫方式

//啟用標準縮排(“漂亮列印”):mapper.enable(SerializationFeature.INDENT_OUTPUT);
//
允許序列化“空”POJO(沒有要序列化的屬性) //(沒有這個設定,在這些情況下丟擲異常)mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); //編寫java.util.Date,Calendar as number(timestamp):mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
// DeserializationFeature用於更改如何將JSON讀取為POJO: //在遇到未知屬性時阻止異常:mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
//
允許將JSON空字串(“”)強制為null物件值:
mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);

此外,您可能需要更改一些低階JSON解析,生成詳細資訊:

//用於配置解析設定的JsonParser.Feature:

//允許JSON中的C / C ++樣式註釋(非標準,預設禁用)
//(注意:使用Jackson 2.5,還有`mapper.enable(feature)`/`mapper.disable(feature)`)mapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);
//
允許在JSON: mapper中允許(非標準)不帶引號的欄位名稱配置( JsonParser 功能 ALLOW_UNQUOTED_FIELD_NAMES); //允許使用撇號(單引號),非標準mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
//
用於配置低階JSON生成的JsonGenerator.Feature: //強制轉義非ASCII字元:
mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);

Jackson功能頁面上介紹了全套功能

註釋:更改屬性名稱

最簡單的基於註釋的方法是使用如下@JsonProperty註釋:

public  class  MyBean {
    private  String _name;

   //沒有註釋,我們得到“theName”,但我們想要“name”:  @JsonProperty("name")
   public String getTheName() { return _name; }
//注意:只需在getter或setter上添加註釋即可; //所以我們可以省略它 public void setTheName(String n) { _name = n; }
}

還有其他機制可用於系統命名更改:有關詳細資訊,請參閱自定義命名約定

另請注意,您可以使用“ 混合註釋”來關聯所有註釋。

註釋:忽略屬性

有兩個主要註釋可用於忽略屬性:@JsonIgnore對於單個屬性; @JsonIgnoreProperties為每班定義

//意味著如果我們在JSON中看到“foo”或“bar”,它們將被靜靜地跳過
//無論POJO是否具有這樣的屬性
@JsonIgnoreProperties({ "foo", "bar" })
public class MyBean
{
   // will not be written as JSON; nor assigned from JSON:
   @JsonIgnore
   public String internal;

   // no annotation, public field is read/written normally
   public String ext