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

how to parse given data into a java object

我想将下面给定的数据解析为某个 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 class 测试 {

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

您可以通过多种方式做到这一点。

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

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

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

"{\"Address

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

这里的主要问题是输入根本不是有效的 JSON 字符串,JSON 解析器不会接受它。双引号必须被转义。 一个有效的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"]}}