如何将给定数据解析为java对象
我想将下面给定的数据解析到某个java对象中,但我无法解析。字符串如下-如何将给定数据解析为java对象,java,json,parsing,hashmap,treemap,Java,Json,Parsing,Hashmap,Treemap,我想将下面给定的数据解析到某个java对象中,但我无法解析。字符串如下- {\"objectsTree\":\"{\"Address\":[],\"Customer\":[\"Address\"]}\",\"objectsSequence\":\"[\"Customer\",\"Address\"]\"} 我已经尝试将其解析为HashMap和HashMap 但这会返回格式错误的JSON异常,这是有意义的,因为太多双引号对象会突然结束。我想对其进行如下分析- { "objectsTree":"{
{\"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());
}
publicstaticvoidmain(字符串[]args){
//字符串json=“{\'Success\”:true,\'Message\':\'Invalid access token.\'}”;
字符串json=“{\'objectsTree\”:\“{\'Address\”:[],\“Customer\”:[\“Address\”]}\,\“objectsSequence\”:\“[\“Customer\”,\“Address\”]\”;
Gson-jsonParser=new-Gson();
@抑制警告(“未选中”)
HashMap jo=(HashMap)jsonParser.fromJson(json,HashMap.class);
系统输出打印LN(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:
"}" ...
"," ...
线程“main”com.google.gson.JsonParseException中的异常:解析JSON失败来源:java.io。StringReader@201644c9到Json
位于com.google.gson.JsonParser.parse(JsonParser.java:59)
位于com.google.gson.gson.fromJson(gson.java:443)
位于com.google.gson.gson.fromJson(gson.java:396)
位于com.google.gson.gson.fromJson(gson.java:372)
位于org.syncoms.backofficesuite.controller.Test.main(Test.java:16)
原因:com.google.gson.ParseException:在第1行第19列遇到“地址”。
我期待的是:
"}" ...
"," ...
有多种方法可以做到这一点 首先,如果您的数据总是具有相同的格式,您可以简单地创建一些方法,这些方法将根据需要创建树映射和ArrayList。使用String.replace()、StringTokenizer和matcher模式,您可以做任何事情。您可以将数据拆分为令牌,并根据需要将它们放入所需的数据结构中。我发现这种方法非常有效,一旦您更好地了解如何解析数据和提取所需内容,您就可以在许多其他示例中使用这种方法
如果您的数据是JSON格式的,那么可能有更简单的解析方法。您可以很容易地将其解码为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]}
String a=“{\r\n”+
“\'objectsTree\':{\'Address\':[],\'Customer\':[\'Address\']}\r\n”+
“\”objectsSequence\”:[\”客户\“,\”地址\“]\r\n”+
"}";
ObjectMapper mapper=新的ObjectMapper();
HashMap jo=(HashMap)mapper.readValue(a,HashMap.class);
System.out.println(“结果:+jo”);
结果:{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)
String json=“{\'objectsTree\”:\“{\'Address\”:[],\“Customer\”:[\'Address\']}\,\“objectsSequence\”:\“[\'Customer\”,\'Address\']\”;
ObjectMapper mapper=新的ObjectMapper();
HashMap jo=(HashMap)mapper.readValue(json,HashMap.class);
System.out.println(“结果:+jo”);
错误:
线程“main”org.codehaus.jackson.JsonParseException中出现异常:意外字符('A'(代码65)):应使用逗号分隔对象条目
在[来源:java.io。StringReader@77d2b01b;行:1,列:20]
位于org.codehaus.jackson.JsonParser.\u constructError(JsonParser.java:943)
在json字符串中,对于key objectsTree,值以\“开头,其匹配\”在字符串地址之前关闭。这导致了分析错误
“{\”地址
另外两个答案也表示json字符串的格式无效。
我还添加了支持的json值供您参考。
如果更改为正确的格式,任何json解析器都可以工作,这里的主要问题是输入不是有效的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);
发布一个完整的最小代码示例,再现错误,以及错误的完整堆栈跟踪我已在问题中添加了代码和错误,请检查更新的问题谢谢您的输入,但在我的场景中,我永远不会更改字符串,因为它太动态,我可以接收任何内容,但格式将相同。表示一个树p和一个ArrayList。我上面给出的代码也不能解析这个字符串,但是,这是一个有效的JSON字符串。示例代码运行良好。尝试Jackson Parser。您给出的答案是正确的,但是这并不能解决我的问题,但我从您的输入中得到了想法,我通过更改输入模式得到了解决方案总共。谢谢。这不是更详细的解释。看我的答案。
{objectsSequence=["Customer","Address"], objectsTree={"Address":[],"Customer":["Address"]}}