繁体   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