如何将给定数据解析为java对象

时间:2015-08-13 12:24:56

标签: java json parsing hashmap treemap

我想解析下面的给定数据到一些java对象,但我无法解析。字符串如下 -

{\"objectsTree\":\"{\"Address\":[],\"Customer\":[\"Address\"]}\",\"objectsSequence\":\"[\"Customer\",\"Address\"]\"}

我尝试将其解析为HashMap和HashMap 但是这会返回格式错误的JSON异常,这是有道理的,因为太多双引号对象突然结束。我想解析如下 -

{
"objectsTree":"{"Address":[],"Customer":["Address"]}",
"objectsSequence":"["Customer","Address"]"
}

在这里你可以看到objectsTree是针对一个字符串的一个对象而objectSequence是另一个字符串。特定对象树应该是树图,对象序列应该是一个ArrayList。

任何想法我应该如何进行。

代码更新 -

package org.syncoms.backofficesuite.controller;

import java.util.HashMap;

导入com.google.gson.Gson;

公共课测试{

public static void main(String[] args) {

    //String json = "{\"Success\":true,\"Message\":\"Invalid access token.\"}";
    String json ="{\"objectsTree\":\"{\"Address\":[],\"Customer\":[\"Address\"]}\",\"objectsSequence\":\"[\"Customer\",\"Address\"]\"}";
    Gson jsonParser = new Gson();
    @SuppressWarnings("unchecked")
    HashMap<String,Object> jo = (HashMap<String,Object>) jsonParser.fromJson(json, HashMap.class);
    System.out.println(jo);
    //Assert.assertNotNull(jo);
    //Assert.assertTrue(jo.get("Success").getAsString());


}

}

我得到的错误 -

Exception in thread "main" com.google.gson.JsonParseException: Failed parsing JSON source: java.io.StringReader@201644c9 to Json
    at com.google.gson.JsonParser.parse(JsonParser.java:59)
    at com.google.gson.Gson.fromJson(Gson.java:443)
    at com.google.gson.Gson.fromJson(Gson.java:396)
    at com.google.gson.Gson.fromJson(Gson.java:372)
    at org.syncoms.backofficesuite.controller.Test.main(Test.java:16)
Caused by: com.google.gson.ParseException: Encountered " <IDENTIFIER_SANS_EXPONENT> "Address "" at line 1, column 19.
Was expecting one of:
    "}" ...
    "," ...

3 个答案:

答案 0 :(得分:2)

这里的主要问题是输入根本不是有效的JSON字符串,并且没有JSON解析器会接受它。 doulbe qoutes必须逃脱。 有效的JSON字符串如下:

String jsonInput = "{\"objectsTree\":\"{\\\"Address\\\":[],\\\"Customer\\\":[\\\"Address\\\"]}\",\"objectsSequence\":\"[\\\"Customer\\\",\\\"Address\\\"]\"}";

这可以使用例如杰克逊解析:

ObjectMapper om = new ObjectMapper();
TypeFactory tf = om.getTypeFactory();
JavaType mapType = tf.constructMapType(HashMap.class, String.class, String.class);
Map<String, String> map = (Map<String, String>)om.readValue(jsonInput, mapType);
System.out.println(map);

打印输出:

{objectsSequence=["Customer","Address"], objectsTree={"Address":[],"Customer":["Address"]}}

答案 1 :(得分:0)

有多种方法可以做到这一点。

首先,如果您的数据始终具有相同的格式,您可以简单地创建一些方法,根据需要创建TreeMap和ArrayList。你可以用String.replace(),StringTokenizer,matcher模式做你想做的一切。您可以将数据拆分为令牌,并根据需要将其放入所需的数据结构中。我发现这种方式非常有效,一旦你更好地了解如何解析数据并提取你需要的东西,你可以在许多其他例子中使用它。

如果你的数据是用JSON格式化的,那么可能有更简单的方法来解析它。你可以很容易地将它解码为Java对象。

答案 2 :(得分:0)

JSON字符串形成不好。请尝试以下

{
"objectsTree":{"Address":[],"Customer":["Address"]},
"objectsSequence":["Customer","Address"]
}

JSON键总是字符串&amp;
JSON值可以是:

•A number (integer or floating point)
•A string (in double quotes)
•A Boolean (true or false)
•An array (in square brackets)
•An object (in curly braces)
•null.

请参阅以下代码,其中包含格式良好的字符串及其输出

String a = "{\r\n" + 
"\"objectsTree\":{\"Address\":[],\"Customer\":[\"Address\"]},\r\n" + 
"\"objectsSequence\":[\"Customer\",\"Address\"]\r\n" + 
"}";

ObjectMapper mapper = new ObjectMapper();
HashMap<String,Object> jo = (HashMap<String,Object>) mapper.readValue(a, HashMap.class);
System.out.println("result: "+ jo);

result: {objectsTree={Address=[], Customer=[Address]}, objectsSequence=[Customer, Address]}

使用你的json字符串

String json ="{\"objectsTree\":\"{\"Address\":[],\"Customer\":[\"Address\"]}\",\"objectsSequence\":\"[\"Customer\",\"Address\"]\"}";
ObjectMapper mapper = new ObjectMapper();
HashMap<String,Object> jo = (HashMap<String,Object>) mapper.readValue(json, HashMap.class); 
System.out.println("result: "+ jo);

error :
Exception in thread "main" org.codehaus.jackson.JsonParseException: Unexpected character ('A' (code 65)): was expecting comma to separate OBJECT entries
at [Source: java.io.StringReader@77d2b01b; line: 1, column: 20]
at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:943)

在json字符串中,对于关键对象树,该值以\&#34;开头。及其匹配\&#34;在字符串Address之前关闭。这导致解析错误。

  

&#34; {\&#34;地址

另外两个答案也说你的json字符串格式无效。 我还添加了支持的json值供您参考。 如果更改为正确的格式,任何json解析器都可以工作,