Java解析json(二):jackson
Java解析json(二):jackson
官方参考
Jackson Home Page:https://github.com/FasterXML/jackson
Jackson Wiki:http://wiki.fasterxml.com/JacksonHome
Jackson doc: https://github.com/FasterXML/jackson-docs
Jackson Download Page:http://wiki.fasterxml.com/JacksonDownload
简介
Jackson框架是基于Java平台的一套数据处理工具,被称为“最好的Java Json解析器”。
Jackson有两个主要分支,1.x处于维护状态,只会发布bug修复版本。2.x还在积极地开发当中。这两个版本的Java包名和Maven artifact不一样,所以它们不互相兼容,但是可以和平共存,也就是项目可以同时依赖1.x和2.x而不会发生冲突。
Jackson版本: 1.x (目前版本从1.1~1.9)与2.x。1.x与2.x从包的命名上可以看出来,1.x的类库中,包命名以:org.codehaus.jackson.xxx开头,而2.x类库中包命令:com.fastxml.jackson.xxx开头。
本文以2.x为主…
主要模块
1. 核心模块
核心模块是扩展模块构建的基础,到2.7版本为止,共有3个核心模块(依赖关系从上到下):
***Streaming*** : jackson-core jar,定义了底层的streaming API和实现了Json特性。
***Annotations*** : jackson-annotations jar,包含了标准的Jackson注解。
***Databind*** : jackson-databind jar,实现了数据绑定和对象序列化,它依赖于streaming和annotations的包。
- 1
- 2
- 3
- 4
- 5
- 6
2. 第三方数据类型模块
这些扩展是插件式的Jackson模块,用ObjectMapper.registerModule()注册,并且通过添加serializers和deserializers以便Databind包(ObjectMapper / ObjectReader / ObjectWriter)可以读写这些类型,来增加对各种常用的Java库的数据类型的支持。参考https://github.com/FasterXML/jacksonThird-party datatype modules。
3. 数据格式模块
Jackson也有处理程序对JAX-RS标准实现者例如Jersey, RESTeasy, CXF等提供了数据格式支持。处理程序实现了MessageBodyReader和MessageBodyWriter,目前支持的数据格式包括JSON, Smile, XML, YAML和CBOR。
数据格式提供了除了Json之外的数据格式支持,它们绝大部分仅仅实现了streaming API abstractions,以便数据绑定组件可以按照原来的方式使用。另一些(几乎不需要)提供了databind标准功能来处理例如schemas。参考https://github.com/FasterXML/jacksonData format modules
准备工作
JDK1.7,依赖jackon的三个核心类库:
- jackson-core-2.5.3.jar
- jackson-annotations-2.5.3.jar
- jackson-databind-2.5.3.jar
maven依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.4</version>
</dependency>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
处理Json
Jackson提供了三种可选的Json处理方法:流式API(Streaming API) 、树模型(Tree Model)、数据绑定(Data Binding)。三种处理Json的方式的特性:
- Streaming API:是效率最高的处理方式(开销低、读写速度快,但程序编写复杂度高)
- Tree Model:是最灵活的处理方式
- Data Binding:是最常用的处理方式
1.Data Binding
主要使用ObjectMapper来操作Json,默认情况下会使用BeanSerializer来序列化POJO。
如果是解析,那么如下的例子里的TestJson必须要有setters,且setters必须是public修饰的,否则属性的值将会为null。
如果是生成,那么必须有getters,且getters必须是public修饰的。
如果属性不是private修饰,那么可以不用有getters和setters。(参考访问修饰符)
要点:
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(jsonFile, Bean);
mapper.readValue(jsonFile, Bean.class/Collection< Bean >);
(1)生成json
city.java
package com.myjackson.databinding;
//市
public class City {
private Integer id;
private String cityName;
public City(){}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
province.java
package com.myjackson.databinding;
import java.util.Date;
import java.util.List;
//省
public class Province {
private Integer id;
private String name;
private Date birthDate;
private List<City> cities;
public Province(){}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<City> getCities() {
return cities;
}
public void setCities(List<City> cities) {
this.cities = cities;
}
public Date getBirthDate() {
return birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
counry.java
package com.myjackson.databinding;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
//国家
public class Country {
private Integer id;
private String countryName;
private Date establishTime;
private List<Province> provinces;
private String[] lakes;
private Map<String, String> forest = new HashMap<String, String>();
public Country(){
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCountryName() {
return countryName;
}
public void setCountryName(String countryName) {
this.countryName = countryName;
}
public Date getEstablishTime() {
return establishTime;
}
public void setEstablishTime(Date establishTime) {
this.establishTime = establishTime;
}
public List<Province> getProvinces() {
return provinces;
}
public void setProvinces(List<Province> provinces) {
this.provinces = provinces;
}
public String[] getLakes() {
return lakes;
}
public void setLakes(String[] lakes) {
this.lakes = lakes;
}
public Map<String, String> getForest() {
return forest;
}
public void setForest(Map<String, String> forest) {
this.forest = forest;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
测试案例
@Test
public void Bean2JsonStr() throws ParseException, JsonGenerationException, JsonMappingException, IOException{
// 使用ObjectMapper转化对象为Json
ObjectMapper mapper = new ObjectMapper();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
mapper.setDateFormat(dateFormat); //设置日期序列化格式
City city1 = new City();
city1.setId(1);
city1.setCityName("gz");
City city2 = new City();
city2.setId(2);
city2.setCityName("dg");
Province province = new Province();
province.setId(1);
province.setName("GD");
province.setBirthDate(new Date());
List<City> cities = new ArrayList<City>();
cities.add(city1);
cities.add(city2);
province.setCities(cities);
Country country = new Country();
country.setCountryName("China");
country.setId(1);
country.setEstablishTime(dateFormat.parse("1949-10-01"));
country.setLakes(new String[] { "Qinghai Lake", "Poyang Lake","Dongting Lake", "Taihu Lake" });
HashMap<String, String> forest = new HashMap<String, String>();
forest.put("no.1", "dxal");
forest.put("no.2", "xxal");
country.setForest(forest);
List<Province> provinces = new ArrayList<Province>();
provinces.add(province);
country.setProvinces(provinces);
mapper.configure(SerializationFeature.INDENT_OUTPUT, true); // 为了使JSON视觉上的可读性,在生产中不需如此,会增大Json的内容
mapper.setSerializationInclusion(Include.NON_EMPTY); // 配置mapper忽略空属性
mapper.writeValue(new File("country.json"), country); // 默认情况,Jackson使用Java属性字段名称作为 Json的属性名称,也可以使用Jackson annotations(注解)改变Json属性名称
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
运行得到country.json:
{
"id" : 1,
"countryName" : "China",
"establishTime" : "1949-10-01",
"provinces" : [ {
"id" : 1,
"name" : "GD",
"birthDate" : "2017-02-04",
"cities" : [ {
"id" : 1,
"cityName" : "gz"
}, {
"id" : 2,
"cityName" : "dg"
} ]
} ],
"lakes" : [ "Qinghai Lake", "Poyang Lake", "Dongting Lake", "Taihu Lake" ],
"forest" : {
"no.1" : "dxal",
"no.2" : "xxal"
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
(2)解析json
@Test
public void JsonStr2Bean() throws JsonParseException, JsonMappingException, IOException{
ObjectMapper mapper = new ObjectMapper();
File jsonFile = new File("country.json");
//当反序列化json时,未知属性会引起的反序列化被打断,这里我们禁用未知属性打断反序列化功能,
//因为,例如json里有10个属性,而我们的bean中只定义了2个属性,其它8个属性将被忽略
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
Country country = mapper.readValue(jsonFile, Country.class);
System.out.println(country.getCountryName()+country.getEstablishTime());
List<Province> provinces = country.getProvinces();
for (Province province : provinces) {
System.out.println("province:"+province.getName() + "\n" + "birthDate:"+province.getBirthDate());
for (City city: province.getCities()) {
System.out.println(city.getId()+" "+city.getCityName());
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
输出结果:
ChinaSat Oct 01 08:00:00 CST 1949
province:GD
getBirthDate:Sat Feb 04 08:00:00 CST 2017
1 gz
2 dg
- 1
- 2
- 3
- 4
- 5
解析的时候如果碰到集合类,那么可以使用TypeReference类
@Test
public void JsonStr2List() throws IOException{
City city1 = new City();
city1.setId(1);
city1.setCityName("gz");
City city2 = new City();
city2.setId(2);
city2.setCityName("dg");
List<City> cities = new ArrayList<City>();
cities.add(city1);
cities.add(city2);
ObjectMapper mapper = new ObjectMapper();
String listJsonStr = mapper.writeValueAsString(cities);
System.out.println(listJsonStr);
List<City> list = mapper.readValue(listJsonStr, new TypeReference<List<City>>(){} );
for (City city: list) {
System.out.println("id:"+city.getId()+" cityName:"+city.getCityName());
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
2.Streaming API
Jackson提供了一套底层API来解析Json字符串,这个API为每个Json对象提供了符号。例如, ‘{’ 是解析器提供的第一个对象(writeStartObject()),键值对是解析器提供的另一个单独对象(writeString(key,value))。这些API很强大,但是需要大量的代码。大多数情况下,Tree Model和Data Binding可以代替Streaming API。
上面代码如果注释掉 city1.setId(1);这行,结果为:
[{"id":null,"cityName":"gz"},{"id":2,"cityName":"dg"}]
id:null cityName:gz
id:2 cityName:dg
- 1
- 2
- 3
但假如想让id为null的不输出,不为null的输出除了 mapper.setSerializationInclusion(Include.NON_EMPTY); // 配置mapper忽略空属性
这种方法外还可以在ObjectMapper中注册一个自定义的序列化JsonSerializer和反序列化
JsonDeSerializer:
CityJsonSerializer.java
package com.myjackson.databinding;
import java.io.IOException;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
public class CityJsonSerializer extends JsonSerializer<City>{
@Override
public void serialize(City city, JsonGenerator jsonGenerator, SerializerProvider arg2)
throws IOException, JsonProcessingException {
jsonGenerator.writeStartObject();
if ( city.getId()!=null) {
jsonGenerator.writeNumberField("id", city.getId());
}
jsonGenerator.writeStringField("cityName", city.getCityName());
jsonGenerator.writeEndObject();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
CityJsonDeSerializer.java
package com.myjackson.databinding;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
public class CityJsonDeSerializer extends JsonDeserializer<List<City>>{
@Override
public List<City> deserialize(JsonParser parser,DeserializationContext deserializationcontext) throws IOException,
JsonProcessingException {
List<City> list = new ArrayList<City>();
// 开始解析数组,第一个JsonToken必须是JsonToken.START_ARRAY"["
if (!JsonToken.START_ARRAY.equals(parser.getCurrentToken())) {
System.out.println(parser.getCurrentToken());
return null;
}
// 解析符号直到字符串结尾
while (!parser.isClosed()) {
// 如果有必要的话,这个方法会沿着流前进直到足以确下一个JsonToken的类型
JsonToken token = parser.nextToken();
// 如果是最后一个JsonToken,那么就结束了
if (token == null)
break;
// 数组的每个元素都是对象,因此下一个JsonToken是JsonToken.START_OBJECT"{"
if (!JsonToken.START_OBJECT.equals(token)) {
break;
}
City city = null;
// 输出id字段的值
while (true) {
if (JsonToken.START_OBJECT.equals(token)) {
city = new City();
}
token = parser.nextToken();
if (token == null)
break;
if (JsonToken.FIELD_NAME.equals(token) ) {
if("id".equals(parser.getCurrentName())){
token = parser.nextToken();
city.setId(parser.getIntValue());
}else if("cityName".equals(parser.getCurrentName())){
token = parser.nextToken();
city.setCityName(parser.getText());
}
}
if(JsonToken.END_OBJECT.equals(token)){
list.add(city);
}
}
}
return list;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
测试:
@Test
public void StreamJsonStr2List() throws IOException{
City city1 = new City();
//city1.setId(1);
city1.setCityName("gz");
City city2 = new City();
city2.setId(2);
city2.setCityName("dg");
List<City> cities = new ArrayList<City>();
cities.add(city1);
cities.add(city2);
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(City.class, new CityJsonSerializer());
mapper.registerModule(module);
String listJsonStr = mapper.writeValueAsString(cities);
System.out.println(listJsonStr);
ObjectMapper mapper2 = new ObjectMapper();
SimpleModule module2 = new SimpleModule();
module2.addDeserializer(List.class, new CityJsonDeSerializer());
mapper2.registerModule(module2);
List<City> list = mapper2.readValue(listJsonStr, new TypeReference<List<City>>(){} );
for (City city: list) {
System.out.println("id:"+city.getId()+" cityName:"+city.getCityName());
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
也可以简单一点,使用注解,省去在ObjectMapper 中注册SimpleModule
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
@JsonSerialize(using=CityJsonSerializer.class)
public class City {
...
}
- 1
- 2
- 3
- 4
- 5
运行结果:
[{"cityName":"gz"},{"id":2,"cityName":"dg"}]
id:null cityName:gz
id:2 cityName:dg
- 1
- 2
- 3
###3.Tree Mode
如果不想为Json结构写一个class的话,Tree Mode是一个很好的选择。
生成json:
@Test
public void TreeMode2Json() throws IOException{
//创建一个节点工厂,为我们提供所有节点
JsonNodeFactory factory = new JsonNodeFactory(false);
//创建一个json factory来写tree modle为json
JsonFactory jsonFactory = new JsonFactory();
//创建一个json生成器
JsonGenerator generator = jsonFactory.createGenerator(new FileWriter(new File("country2.json")));
//注意,默认情况下对象映射器不会指定根节点,下面设根节点为country
ObjectMapper mapper = new ObjectMapper();
ObjectNode country = factory.objectNode();
country.put("id", 1);
country.put("countryName","China");
country.put("establishTime", "1949-10-01");
ArrayNode provinces = factory.arrayNode();
ObjectNode province = factory.objectNode();
ObjectNode city1 = factory.objectNode();
city1.put("id", 1);
city1.put("cityName", "gz");
ObjectNode city2 = factory.objectNode();
city2.put("id", 1);
city2.put("cityName", "dg");
ArrayNode cities = factory.arrayNode();
cities.add(city1).add(city2);
province.put("cities", cities);
provinces.add(province);
country.put("provinces",provinces);
ArrayNode lakes = factory.arrayNode();
lakes.add("QingHai Lake").add("Poyang Lake").add("Dongting Lake").add("Taihu Lake");
country.put("lakes",lakes);
ObjectNode forest = factory.objectNode();
forest.put("no.1","dxal");
forest.put("no.2", "xxal");
country.put("forest", forest);
mapper.setSerializationInclusion(Include.NON_EMPTY); // 配置mapper忽略空属性
mapper.writeTree(generator, country);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
结果:
{
"id":1,
"countryName":"China",
"establishTime":"1949-10-01",
"provinces":[
{"cities":[
{"id":1,"cityName":"gz"},
{"id":1,"cityName":"dg"}
]
}
],
"lakes":["QingHai Lake","Poyang Lake","Dongting Lake","Taihu Lake"],
"forest":{"no.1":"dxal","no.2":"xxal"}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
读取json:
@Test
public void TreeModeReadJson() throws IOException{
ObjectMapper mapper = new ObjectMapper();
// Jackson提供一个树节点被称为"JsonNode",ObjectMapper提供方法来读json作为树的JsonNode根节点
JsonNode node = mapper.readTree(new File("country2.json"));
// 看看根节点的类型
System.out.println("node JsonNodeType:"+node.getNodeType());
System.out.println("---------得到所有node节点的子节点名称----------------------");
Iterator<String> fieldNames = node.fieldNames();
while (fieldNames.hasNext()) {
String fieldName = fieldNames.next();
System.out.print(fieldName+" ");
}
System.out.println("\n---------------------------------------------------");
JsonNode lakes = node.get("lakes");
System.out.println("lakes:"+lakes+" JsonNodeType:"+lakes.getNodeType());
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
运行结果:
node JsonNodeType:OBJECT
---------得到所有node节点的子节点名称-------------------------
id countryName establishTime provinces lakes forest
-----------------------------------------------------
lakes:["QingHai Lake","Poyang Lake","Dongting Lake","Taihu Lake"] JsonNodeType:ARRAY
- 1
- 2
- 3
- 4
- 5
结束
Stream API方式是开销最低、效率最高,但编写代码复杂度也最高,在生成Json时,需要逐步编写符号和字段拼接json,在解析Json时,需要根据token指向也查找json值,生成和解析json都不是很方便,代码可读性也很低。
Databinding处理Json是最常用的json处理方式,生成json时,创建相关的java对象,并根据json内容结构把java对象组装起来,最后调用writeValue方法即可生成json,
解析时,就更简单了,直接把json映射到相关的java对象,然后就可以遍历java对象来获取值了。
TreeModel处理Json,是以树型结构来生成和解析json,生成json时,根据json内容结构,我们创建不同类型的节点对象,组装这些节点生成json。解析json时,它不需要绑定json到java bean,根据json结构,使用path或get方法轻松查找内容。
以上为个人参考网上博客以及一些个人实践,不对之处烦请指正,感激不尽~
参考:
http://blog.csdn.net/gjb724332682/article/details/51586701#
http://blog.csdn.net/java_huashan/article/details/46375857
Java解析json(二):jackson的更多相关文章
- Java解析json字符串和json数组
Java解析json字符串和json数组 public static Map<String, String> getUploadTransactions(String json){ Map ...
- java解析Json字符串之懒人大法
面对Java解析Json字符串的需求,有很多开源工具供我们选择,如google的Gson.阿里巴巴的fastJson.在网上能找到大量的文章讲解这些工具的使用方法.我也是参考这些文章封装了自己的Jso ...
- Introduction to Structured Data json的2种形式 JAVA解析JSON数据 - JsonArray JsonObject
https://developers.google.com/search/docs/guides/intro-structured-data Structured data refers to kin ...
- java解析json数组
java解析json数组 import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; ...
- Java解析JSON文件的方法
http://blog.sina.com.cn/s/blog_628cc2b70101dydc.html java读取文件的方法 http://www.cnblogs.com/lovebread/ar ...
- java解析json字符串详解(两种方法)
一.使用JSONObject来解析JSON数据官方提供的,所以不需要导入第三方jar包:直接上代码,如下 private void parseJSONWithJSONObject(String Jso ...
- 除了闹过腥风血雨的fastjson,你还知道哪些Java解析JSON的利器?
昨天下午 5 点 10 分左右,我解决掉了最后一个 bug,轻舒一口气,准备关机下班.可这个时候,老板朝我走来,脸上挂着神秘的微笑,我就知道他不怀好意.果不其然,他扔给了我一个新的需求,要我在 Jav ...
- java解析json
1:下载另外一个Java的小包就可以了: http://www.JSON.org/java/json_simple.zip 里面有源码和文档例题和编程的lib包:编程只需要json_simple.ja ...
- java 解析json的问题
本文转载自http://chriszz.sinaapp.com/?p=392 Json就是Javascript notation,可以替代XML,用做数据交互. Json的两种基本表示形式,可以用自动 ...
随机推荐
- PHPNOW如何添加虚拟主机
1 打开PHPNow控制面板,输入0,点回车 2 新增主机名称(你可以输入127.0.0.2到127.0.0.255),点击回车之后要求输入主机别名,不要写,直接回车,再要求输入网站目录,也不选,再回 ...
- xmpp 服务器配置 open fire for windows 及 spark 测试
xmpp 服务器配置 open fire for windows 此文章为 XMPP windows服务器配置,使用的是 open fire 3.9.1.exe 1: 下载 open fire ope ...
- 推荐一个在线json数据格式化网站
json数据非常友好方便的处理: 推荐一个在线json数据格式化网站 http://json.parser.online.fr/
- tomcat启动报错,找不到相应的 queue,从而引发内存泄漏
tomcat启动报错,无法创建 bean listenerStatusChangeDealHandler, no queue 'STOCK.NOTIFY_CHANGE.INTER.CACHE.QUEU ...
- xmu 1125 越野车大赛(公式推导&&三分)(中等)
xmu 1125.越野车大赛 Description TheBeet正在參加一场越野车大赛.比赛的场地如右图:共分三块.每一块地面的长宽均为N与M,但地表情况不同.越野车在这段路面上的最快速度也不同. ...
- 算法笔记_130:行列递增矩阵的查找(Java)
目录 1 问题描述 2 解决方案 2.1定位法 1 问题描述 在一个m行n列的二维数组中,每一行都按照从左到右递增的顺序排列,每一列都按照从上到下递增的顺序排列.现在输入这样的一个二维数组和一个整 ...
- Drawing points
A point is the most simple graphics object that can be drawn. It is a small spot on the window. #!/u ...
- Servlet 异常处理
当一个 Servlet 抛出一个异常时,Web 容器在使用了 exception-type 元素的 web.xml 中搜索与抛出异常类型相匹配的配置.您必须在 web.xml 中使用 error-pa ...
- 【laravel54】创建控制器、模型
1.创建控制器(可以带上下一级目录)=>(需要带Controller后缀) > php artisan make:controller self/StudentController; 2. ...
- Git使用教程(全)
Git是什么? Git是目前世界上最先进的开源的分布式版本控制系统(没有之一),用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开 ...