【问题标题】:how to parse given data into a java object如何将给定的数据解析为java对象
【发布时间】:2015-11-06 10:02:42
【问题描述】:

我想将以下给定数据解析到某个 java 对象中,但我无法解析。字符串如下 -

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

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

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

在这里您可以看到objectsTree 是一个对象对一个字符串,而objectSequence 是另一个对象。具体来说,对象树应该是树图,对象序列应该是ArrayList。

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

代码更新-

包 org.syncoms.backofficesuite.controller;

导入 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:
    "}" ...
    "," ...

【问题讨论】:

  • 发布重现错误的完整最小代码示例,以及错误的完整堆栈跟踪
  • 我在问题中添加了代码和错误,请检查更新的问题

标签: java json parsing hashmap treemap


【解决方案1】:

JSON 字符串格式不正确。尝试如下

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

JSON 键总是字符串 &
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 字符串中,对于 key objectsTree,该值以 \" 开头,其匹配的 \" 在字符串地址之前关闭。这导致了解析错误。

"{\"地址

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

【讨论】:

  • 连这个都不解析
  • 添加了更详细的解释。看我的回答。
【解决方案2】:

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

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

这可以使用例如 Jackson 来解析:

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"]}}

【讨论】:

  • 我上面给出的代码也无法解析这个字符串
  • 然而,这是一个有效的 JSON 字符串。示例代码运行良好。试试 Jackson 解析器
  • 你给出的答案是正确的,但这并不能解决我的问题,但是我从你的输入中得到了这个想法,我通过完全改变输入模式得到了解决方案。谢谢
【解决方案3】:

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

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

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

【讨论】:

  • 感谢您的输入,但在我的场景中,我永远不会更改字符串,因为它太动态了,我可以接收任何内容,但格式会相同。表示一个treeMap和一个ArrayList。
猜你喜欢
  • 2017-02-20
  • 2012-02-11
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
  • 2016-02-17
  • 2016-12-02
相关资源
最近更新 更多