簡體   English   中英

什么是最適合表示JSON的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通過以下方式序列化JSON

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM