我正在开发一个RESTful Android移动客户端。我的应用和服务器之间的信息交换是JSON。所以我现在有点混淆了什么数据结构选择用于表示JSON响应和数据,因为它们中有很多。我刚停止使用LinkedHashMap<>但据我所知,JSON是无序的。在互联网上我看到人们使用Map<>或HashMap<>为此。
所以问题是 - 为此目的最好的数据结构是什么?或者,如果没有明确的答案 - 使用我提到的数据结构的利弊。
答案 0 :(得分:4)
我不同意第一个答案。开发了REST范例,以便您可以使用对象而不是操作。
对我来说,最明智的方法是在客户端声明bean并解析json响应并通过它们进行请求。我建议使用GSON library进行序列化/反序列化。 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);
答案 1 :(得分:2)
您是在谈论从服务器请求接收和解析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数据可以根据源而有多种格式,因此,它通常在客户端解析并保存在应用程序类对象中使用。或者更一般地说,您可以使用Map<String, Object>
答案 2 :(得分:0)
如果您正在执行除最简单映射之外的任何操作,则应使用完整的类结构。创建类层次结构作为JSON中数据结构的镜像,并使用Jackson使用ObjectMapper将JSON直接映射到类层次结构。
使用此解决方案,您没有任何对象转换为Map或使用JSONObject或JSONArray,并且您的代码中没有任何多级地图遍历。您只需获取JSON字符串,将其提供给ObjectMapper,然后获取一个Object,其中包含ObjectMapper自动映射的子对象(甚至集合)。
答案 3 :(得分:0)
我已将xstream用于serialize 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());
如果您需要进一步的帮助,请告诉我......
答案 4 :(得分:0)
这无疑是我见过的最好的答案:
https://dzone.com/articles/which-is-the-right-java-abstraction-for-json
摘要:共有三种摘要:pojos,映射和列表,以及表示对象,数组和基元的自定义类。每个都有优缺点,没有明确的赢家。
Pojos具有最大的优势,但您不能总是使用它们。如果可以,请使用它们,如果需要,请使用其他。