如何确保Map中的Java数组<string,object =“”>在GSON toJson和fromJson之后维护它的类型

时间:2016-04-25 10:55:37

标签: java arrays json arraylist gson

我有一个通过串口发送JSON的程序,反之亦然。为了不需要整个有效密钥模板,我一直发送客户端通过Map发送请求。

HashMap<String, Object> push = new HashMap<String, Object>();

push.put("Handshake", true);
push.put("Instructions", instructions);
push.put("RobotID", "1337");

然后使用以下代码将其转换为JSON。

Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(myMap);
System.out.println(json);

然后通过串行连接发送JSON。

问题是,这构建了这个完全有效的JSON。

{
  "RobotID": "1337",
  "Instructions": [
    "How to not be accidentally attacked by an autonomous robot.\n1. Don\u0027t stand in front of it.\n2. Don\u0027t try to run past it, it may catch you.\nThats it.",
    "This was a triumph, I\u0027m making a note here. Huge success..."
  ],
  "Handshake": true
}

为什么这是一个问题?

由于HashMap的内容是Object,我无法检查其类型。因此我使用Object.getClass()。getSimpleName();验证这些类至少按名称匹配。这适用于我需要的大多数事情,但是在被转换回HashMap之后,诸如Instructions String []之类的Array对象显示为ArrayList。如果它允许我通过toArray方法检索我需要的类型的数组,这不会是一个问题,但如果我尝试使用除Object之外的任何东西来表示它或尝试转换结果变量,它会抛出异常。

如果您需要知道如何将数据重新导入HashMap,请点击此处。

Gson gson = new Gson();

Type flexibleContainerMap = new TypeToken<Map<String, Object>>(){}.getType();
Map<String, Object> jsonValueStore = gson.fromJson(json, flexibleContainerMap);
String keys[] = new String[0];
keys = jsonValueStore.keySet().toArray(keys);
int i = 0;
while (i < keys.length) 
{

    SetValidate.updateValue(keys[i], jsonValueStore.get(keys[i]));
    i++;

}

我希望你至少得到我的情况的要点,接受任何帮助,包括访问Array / ArrayList中的数据的方法。目标是避免在客户端上增加复杂性。我更喜欢是否可以将Array作为服务器上的数组读取。如果你能提供任何想法,那就太好了。

1 个答案:

答案 0 :(得分:1)

它无法维护其类型,因为json中不存在类型信息。

您可以使用JsonObject / JsonArray等来阅读json:

JsonObject root = new JsonParser().parse(json).getAsJsonObject();

JsonArray instructions = root.getAsJsonArray("Instructions");

您也可以在另一端使用它来创建json,而不是HashMaps。