本文目錄一覽:
- 1、Java解析json數據
- 2、Java的json反序列化:Java數據類可以和json數據結構不一致嗎?
- 3、java中處理JSON的開源工具都有些什麼?那個比較好用
- 4、Java中哪個JSON庫的解析速度是最快的
- 5、java怎麼得到json中的數據
Java解析json數據
一、 JSON (JavaScript Object Notation)一種簡單的數據格式,比xml更輕巧。
Json建構於兩種結構:
1、“名稱/值”對的集合(A collection of name/value pairs)。不同的語言中,它被理解為對象(object),紀錄(record),結構(struct),字典(dictionary),哈希表(hash table),有鍵列表(keyed list),或者關聯數組 (associative array)。 如:
{
“name”:”jackson”,
“age”:100
}
2、值的有序列表(An ordered list of values)。在大部分語言中,它被理解為數組(array)如:
{
“students”:
[
{“name”:”jackson”,“age”:100},
{“name”:”michael”,”age”:51}
]
}
二、java解析JSON步驟
A、服務器端將數據轉換成json字符串
首先、服務器端項目要導入json的jar包和json所依賴的jar包至builtPath路徑下(這些可以到JSON-lib官網下載:)
然後將數據轉為json字符串,核心函數是:
public static String createJsonString(String key, Object value)
{
JSONObject jsonObject = new JSONObject();
jsonObject.put(key, value);
return jsonObject.toString();
}
B、客戶端將json字符串轉換為相應的javaBean
1、客戶端獲取json字符串(因為android項目中已經集成了json的jar包所以這裡無需導入)
public class HttpUtil
{
public static String getJsonContent(String urlStr)
{
try
{// 獲取HttpURLConnection連接對象
URL url = new URL(urlStr);
HttpURLConnection httpConn = (HttpURLConnection) url
.openConnection();
// 設置連接屬性
httpConn.setConnectTimeout(3000);
httpConn.setDoInput(true);
httpConn.setRequestMethod(“GET”);
// 獲取相應碼
int respCode = httpConn.getResponseCode();
if (respCode == 200)
{
return ConvertStream2Json(httpConn.getInputStream());
}
}
catch (MalformedURLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return “”;
}
private static String ConvertStream2Json(InputStream inputStream)
{
String jsonStr = “”;
// ByteArrayOutputStream相當於內存輸出流
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
// 將輸入流轉移到內存輸出流中
try
{
while ((len = inputStream.read(buffer, 0, buffer.length)) != -1)
{
out.write(buffer, 0, len);
}
// 將內存流轉換為字符串
jsonStr = new String(out.toByteArray());
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return jsonStr;
}
}
2、獲取javaBean
public static Person getPerson(String jsonStr)
{
Person person = new Person();
try
{// 將json字符串轉換為json對象
JSONObject jsonObj = new JSONObject(jsonStr);
// 得到指定json key對象的value對象
JSONObject personObj = jsonObj.getJSONObject(“person”);
// 獲取之對象的所有屬性
person.setId(personObj.getInt(“id”));
person.setName(personObj.getString(“name”));
person.setAddress(personObj.getString(“address”));
}
catch (JSONException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return person;
}
public static ListPerson getPersons(String jsonStr)
{
ListPerson list = new ArrayListPerson();
JSONObject jsonObj;
try
{// 將json字符串轉換為json對象
jsonObj = new JSONObject(jsonStr);
// 得到指定json key對象的value對象
JSONArray personList = jsonObj.getJSONArray(“persons”);
// 遍歷jsonArray
for (int i = 0; i personList.length(); i++)
{
// 獲取每一個json對象
JSONObject jsonItem = personList.getJSONObject(i);
// 獲取每一個json對象的值
Person person = new Person();
person.setId(jsonItem.getInt(“id”));
person.setName(jsonItem.getString(“name”));
person.setAddress(jsonItem.getString(“address”));
list.add(person);
}
}
catch (JSONException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
Java的json反序列化:Java數據類可以和json數據結構不一致嗎?
由於時間關係我也沒有寫全,這裡提供一個思路吧。代碼如下:
Account.java:
@Data
public class Account {
private int id;
private String name;
// @PowerfulAnnotation註解是我臆想的
@PowerfulAnnotation(“token.id”)
private String tokenId;
@PowerfulAnnotation(“token.key”)
private String key;
}
PowerfulAnnotation.java:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PowerfulAnnotation {
String value() default “”;
}
測試類Main.java:
public class Main {
public static void main(String[] args) throws Exception {
Account account = new Account();
String ori = “{\n” +
“\”id\”: 11111,\n” +
“\”name\”: \”小李\”,\n” +
“\”token\”: {\n” +
“\”id\”: 22222222,\n” +
“\”key\”: \”ddddddddd\”\n” +
“}\n” +
“}”;
Gson gson = new Gson();
//字符串json轉JsonObject
JsonObject jsonObject = gson.fromJson(ori, JsonObject.class);
//反射獲取目標對象屬性
for (Field field : account.getClass().getDeclaredFields()) {
String fieldName = field.getName();
Class fieldClass = field.getType();
System.out.print(“當前field名:[” + fieldName + “],”);
System.out.println(“當前field類型:[” + fieldClass + “]”);
Annotation annotation = field.getDeclaredAnnotation(PowerfulAnnotation.class);
//檢查是否有PowerfulAnnotation註解
if (annotation != null) {
PowerfulAnnotation powerful = (PowerfulAnnotation) annotation;
String powerfulValue = powerful.value();
System.out.println(“發現PowerfulAnnotation註解,值為:[” + powerfulValue + “]”);
String[] tmp = powerfulValue.split(“\\.”);
//聲明一個臨時JsonObject,將用於獲取下一層json對象
JsonObject tmpJson = jsonObject;
for (int i = 0; i tmp.length; i++) {
//目標值是在powerfulValue的最後一個字段,例如powerfulValue為token.id的話,目標的值就是id,所以先獲取token這個jsonObject,並賦值給臨時tmpJson
if (i != tmp.length – 1) {
tmpJson = jsonObject.get(tmp[i]).getAsJsonObject();
} else {
//到達powerfulValue的最後一個字段,檢查其類型,並賦值給目標對象
Object value = checkFieldType(tmpJson, tmp[i], fieldClass);
//從目標對象中獲取目標屬性
Field targetField = account.getClass().getDeclaredField(field.getName());
targetField.setAccessible(true);//解除私有限制
System.out.println(“將[” + powerfulValue + “]的值[” + value + “]賦給目標對象的[” + fieldName + “]”);
//將值賦值給目標屬性
targetField.set(account, value);
}
}
}
//屬性上沒有PowerfulAnnotation註解
else {
//檢查當前屬性的類型
Object value = checkFieldType(jsonObject, fieldName, fieldClass);
//從目標對象中獲取目標屬性
Field targetField = account.getClass().getDeclaredField(field.getName());
targetField.setAccessible(true);//解除私有限制
System.out.println(“直接將值[” + value + “]賦給目標對象的[” + fieldName + “]”);
//將值賦值給目標屬性
targetField.set(account, value);
}
System.out.println(“*********************************************\n”);
}
System.out.println(“目標對象最終值:” + account);
}
/**
* 檢查當前屬性的類型
* (這裡由於時間關係,我沒有寫全,只檢查了String、int、boolean類型,全類型應包括boolean、char、byte、short、int、long、float、double,你有時間自己補充一下)
*
* 如果發現當前屬性是一個對象,那麼應該將JsonObject轉換成對應的對象再返回(由於時間關係,這裡我也沒有試過,總之思路是這樣)
*/
private static Object checkFieldType(JsonObject field, String fieldName, Class fieldClass) {
if (fieldClass == String.class) {
return field.get(fieldName).getAsString();
}
if (fieldClass == int.class) {
return field.get(fieldName).getAsInt();
}
if (fieldClass == boolean.class) {
return field.get(fieldName).getAsBoolean();
}
return new Gson().fromJson(field.get(fieldName), fieldClass);
}
}
代碼還沒寫完,主要集中在沒有對JsonArray進行處理,當json串里包含數組時會報錯,另外一些沒寫完的我在注釋里寫了點,你可以參照一下。整體思路還是利用java反射機制進行。
以上代碼運行結果:
java中處理JSON的開源工具都有些什麼?那個比較好用
我用過的有jackson,谷歌的gson,阿里的fastjson
fastjson在遍歷JSONObject的時候順序不是有序的,想要有序還得改源碼,比較麻煩,序列化對象時屬性的順序也不能保證,是我放棄使用的主要原因
gson是用起來是最痛快的,一句話就能解決
String string = new Gson().toJson(user);
User user = new Gson().fromeJson(string, User.class);
特點是不報錯,如果輸入的json字符串和Java Bean的屬性對應不上,相應屬性會為null或默認值
這是優點還是缺點就見仁見智了,至少我在轉換一些不太規則的API返回值時還是挺方便的。
Java中哪個JSON庫的解析速度是最快的
FastJson效率最高,是阿里巴巴開源 的Json處理工具包,包括“序列化”和“反序列化”兩部分,它具備如下特徵:
速度最快,測試表明,fastjson具有極快的性能,超越任其他的Java Json parser。包括自稱最快的JackJson;
功能強大,完全支持Java Bean、集合、Map、日期、Enum,支持范型,支持自省;無依賴,能夠直接運行在Java SE 5.0以上版本;支持Android;
java怎麼得到json中的數據
如果不是Android開發環境的話,首先需要引入處理JSON數據的包:json-lib-2.2.3-jdk15.jar
Java樣例程序如下:
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class DoJSON {
public static void main(String[] args) {
JSONArray employees = new JSONArray(); //JSON數組
JSONObject employee = new JSONObject(); //JSON對象
employee.put(“firstName”, “Bill”); //按“鍵-值”對形式存儲數據到JSON對象中
employee.put(“lastName”, “Gates”);
employees.add(employee); //將JSON對象加入到JSON數組中
employee.put(“firstName”, “George”);
employee.put(“lastName”, “Bush”);
employees.add(employee);
employee.put(“firstName”, “Thomas”);
employee.put(“lastName”, “Carter”);
employees.add(employee);
System.out.println(employees.toString());
for(int i=0; iemployees.size(); i++) {
JSONObject emp = employees.getJSONObject(i);
System.out.println(emp.toString());
System.out.println(“FirstName :\t” + emp.get(“firstName”));
System.out.println(“LastName : \t” + emp.get(“lastName”));
}
}
}
運行效果:
[{“firstName”:”Bill”,”lastName”:”Gates”},{“firstName”:”George”,”lastName”:”Bush”},{“firstName”:”Thomas”,”lastName”:”Carter”}]
{“firstName”:”Bill”,”lastName”:”Gates”}
FirstName : Bill
LastName : Gates
{“firstName”:”George”,”lastName”:”Bush”}
FirstName : George
LastName : Bush
{“firstName”:”Thomas”,”lastName”:”Carter”}
FirstName : Thomas
LastName : Carter
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/181890.html