[英]What data structure is most suitable for implementing a 2-D array in Java?
[英]What is the most suitable Java data structure for representing JSON?
我正在開發RESTful Android移動客戶端。 我的應用程序和服務器之間的信息交換是使用JSON。 因此,我現在有點困惑,選擇哪種數據結構代表JSON響應和數據,因為它們很多。 我剛剛停止使用LinkedHashMap <>,但據我所知,JSON是無序的。 在整個互聯網上,我看到人們為此使用Map <>或HashMap <>。
那么問題來了-為此目的最好的數據結構是什么? 或者,如果沒有明確的答案-使用我提到的數據結構的利弊。
我不同意第一個答案。 開發REST范例是為了使您可以使用對象而不是操作。
對我來說,最明智的方法是在客戶端聲明bean並解析json響應並通過它們進行請求。 我建議使用GSON庫進行序列化/反序列化。 JsonObject
/ JsonArray
幾乎從來不是最佳選擇。
也許如果您給出了將要使用的操作的示例,我們也許可以提供更精確的幫助。
編輯:讓我也給出一些GSON示例。 讓我們使用該線程來比較不同的庫。
在大多數情況下,REST服務會通信對象。 假設您發布了一個與商店有關的產品信息。
{ "name": "Bread",
"price": 0.78,
"produced": "08-12-2012 14:34",
"shop": {
"name": "neighbourhood bakery"
}
}
然后,如果您聲明以下bean:
public class Product {
private String name;
private double price;
private Date produced;
private Shop shop;
// Optional Getters and setters. GSON uses reflection, it doesn't need them
// However, better declare them so that you can access the fields
}
public class Shop {
private String name;
// Optional Getters and setters. GSON uses reflection, it doesn't need them
// However, better declare them so that you can access the fields
}
您可以使用以下方法反序列化json:
String jsonString; // initialized as you can
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setDateFormat("MM-dd-yyyy HH:mm"); // setting custom date format
Gson gson = gsonBuilder.create();
Product product = gson.fromJson(jsonString, Product.class);
// Do whatever you want with the object it has its fields loaded from the json
另一方面,您可以更輕松地序列化為json:
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setDateFormat("MM-dd-yyyy HH:mm"); // setting custom date format
Gson gson = gsonBuilder.create();
String jsonString = gson.toJson(product);
您是在談論從服務器請求中接收和解析JSON字符串嗎?
為此,您可以使用:
import org.json.JSONArray;
import org.json.JSONObject;
使用這些,我從POST請求中讀取了JSON數組,並將結果信息存儲在項目的Class對象中。
對於JSONArray中的每個項目,都可以像這樣提取JSONObject和屬性:
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
jsonObject.getString("text");
}
就實際存儲數據而言,如上所述,JSON數據可以有多種格式,具體取決於源,因此,通常在客戶端將其解析並保存在應用程序Class對象中以供使用。 或更籠統地說,您可以使用Map<String, Object>
存儲數據
如果除了最簡單的映射外,您還需要執行其他操作,則應使用完整的類結構。 創建類層次結構作為JSON中數據結構的鏡像,並使用Jackson通過ObjectMapper將JSON直接映射到類層次結構。
使用此解決方案,您無需強制轉換要映射的對象或使用JSONObject或JSONArray進行處理,並且代碼中無需進行任何多級映射遍歷。 您只需獲取JSON字符串,將其輸入到ObjectMapper,然后獲取一個Object,該Object包含由ObjectMapper自動映射的子對象(甚至是集合)。
XStream xstream = new XStream(new JsonHierarchicalStreamDriver());
xstream.setMode(XStream.NO_REFERENCES);
xstream.alias("myAlias", MyClass.class); // requires a no argument constructor
System.out.println(xstream.toXML(product));
好的,評論中的紳士想要反序列化示例,您在這里:
XStream xstream = new XStream(new JsonHierarchicalStreamDriver());
xstream.alias("myAlias", MyClass.class);
Product product = (Product)xstream.fromXML(json);
System.out.println(product.getName());
讓我知道您是否需要進一步的幫助...
這是我見過的最好的答案:
https://dzone.com/articles/which-is-the-right-java-abstraction-for-json
簡介:有三種摘要:pojos,映射和列表,以及代表對象,數組和基元的自定義類。 每個都有優缺點,沒有明確的贏家。
Pojos具有最大的優勢,但您不能總是使用它們。 如果可以,請使用它們;如果需要,請使用其他。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.