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-core
和jackson-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 List
,Map
s:
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值,則需要指明實際型別(注意:對於具有List
etc型別的POJO屬性,這不是必需的):
Map<String, ResultValue> results = mapper.readValue(jsonSource,
new TypeReference<Map<String, ResultValue>>() { } );
// why extra work? Java Type Erasure will prevent type detection otherwise
(注意:無論通用型別如何,序列化都不需要額外的工作)
可是等等!還有更多!
雖然處理Map
s,List
s和其他“簡單”物件型別(字串,數字,布林值)可能很簡單,但物件遍歷可能很麻煩。這就是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);
註釋:更改屬性名稱
最簡單的基於註釋的方法是使用如下@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