我有一个套接字服务器正在运行,它将为客户端发出json字符串。我试着用json-simple来解析它们。但是,我面临的问题是,服务器没有任何分隔符来隔离json字符串。所以,我的json-simple JSONParser会抛出ParseException。
作为替代方案,我尝试使用json-smart。但是,在这种情况下,JSONParser只返回第一个对象并忽略其余的字符串。
我是这个json解析东西的新手。如果人们可以指导我正确处理json字符串流的方式,那就太好了。
编辑: - 添加JSON字符串和示例代码
{"type":"response","id":"1","result":[true,0]}{"type":"response","id":"2","result":[true,1]}
当我使用json-smart时,此方法返回单个对象,使用json-simple时返回null。
public JSONObject getResponse(JSONObject request) {
String s = null;
Socket soc = null;
PrintWriter sout = null;
BufferedReader sin = null;
try {
soc = new Socket(InetAddress.getByName("127.0.0.1"), 9090);
sout = new PrintWriter(soc.getOutputStream());
sin = new BufferedReader(
new InputStreamReader(soc.getInputStream()));
sout.println(request.toJSONString());
sout.flush();
s = sin.readLine();
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
try {
sin.close();
sout.close();
soc.close();
} catch (Exception e) {
}
}
Object response = null;
try {
response = JSONValue.parseWithException(s.toString());
}catch (ParseException e){
e.printStackTrace();
}
return (JSONObject) response;
提前致谢,
冠者
答案 0 :(得分:0)
我找到了使用Jackson的解决方案。这是适用于我的代码。
MappingJsonFactory factory = new MappingJsonFactory();
JsonParser parser = factory.createParser(soc.getInputStream());
JsonToken curToken = parser.nextToken();
if (curToken != JsonToken.START_OBJECT) {
System.err.println("Not in start object!, Exiting...");
return null;
}
while (runParser.get() == true) {
if (curToken == JsonToken.START_OBJECT) {
TreeNode node = parser.readValueAsTree();
System.out.println(node.getClass().getName());
System.out.println(node);
}
curToken = parser.nextToken();
}
答案 1 :(得分:0)
谢谢Kaja Mohideen!它正在处理while循环中的一个小变化。 这段代码完美无缺。在我的情况下输入json在文件中。 使用的库:jackson-core,jackson-annotation和jackson-databind
MappingJsonFactory factory = new MappingJsonFactory();
JsonParser parser = null;
File file = new File("jsontest.txt");
try {
parser = factory.createParser(file);
JsonToken curToken = parser.nextToken();
if (curToken != JsonToken.START_OBJECT) {
System.err.println("Not in start object!, Exiting...");
}
while (parser.hasCurrentToken()) {
if (curToken == JsonToken.START_OBJECT) {
TreeNode node = parser.readValueAsTree();
System.out.println(node);
}
curToken = parser.nextToken();
}
} catch (JsonParseException e) {
e.printStackTrace();
}