将JsonNode转换为Java数组

15
我正在使用Play框架2、WebSocket和JsonNode进行开发。前端通过WebSocket连接到Play框架的后端。我将JavaScript数组转换为JsonNode,并通过WebSocket连接将其发送到后端。 现在我的问题是如何将Json对象转换为Java数组或任何适当的数据结构,以便我可以操作数据。
这是我创建的Json对象:
var myjeson = {"x":arrayX,"y":arrayY} ;

这是一个动态填充的数组。

 function pixelCount ()
    {  arrayX[counter] = xcoordinate;        
    arrayY[counter] = ycoordinate;
    socket.send(" from array X,Y  "+arrayX[counter]+ " " +arrayY[counter]); 
    ++counter;      
    }

以下代码会发送数据

$('button.send').click(function() {            
sock.send(JSON.stringify(myjeson)); 

在服务器端,我有以下代码

 public static WebSocket<JsonNode> givenIn() {
    return new WebSocket<JsonNode>() {
    // called when the websocket is established
    public void onReady(WebSocket.In<JsonNode> in, WebSocket.Out<JsonNode> out) {
    // register a callback for processing instream events             
    in.onMessage(new Callback<JsonNode>() {
    public void invoke(JsonNode event) {                 
    Logger.info(event.toString());
    }

当我查看日志时,消息已经被传递了: 以下是日志信息 [info] 应用程序 -

{"x":
[78.72727298736572,79.72727298736572,82.72727298736572,
7298736572,93.72727298736572,83.72727298736572132.72727298736572],

"y":
[82.6363639831543,82.6363639831543,63.54545593261719,63.54545593261719,64.545455932
61719,65.54545593261719,70.54545593261719,189.5454559326172,188.5454559326172]}

现在我想把这些数据放入一个数组中,以便我可以访问它们。欢迎任何建议,也欢迎提供替代方案。

5个回答

40

由于我的评论得到了很多赞,我将其转化为答案。

这应该可以满足原帖的需求:

new ObjectMapper().convertValue(jsonNode, ArrayList.class)


3
使用tree-model可以快速实现此操作...将JSON字符串转换为JsonNode的树形结构:
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree("...<JSON string>...");

然后提取子节点并将它们转换为列表:
List<Double> x = mapper.convertValue(rootNode.get("x"), ArrayList.class);
List<Double> y = mapper.convertValue(rootNode.get("y"), ArrayList.class);

一种稍微冗长但更好的方法是定义一个代表预期JSON结构的类:
public class Request {
    List<Double> x;
    List<Double> y;
}

然后可以直接按照以下方式反序列化:

Request request = mapper.readValue("...<JSON string>...", Request.class);

2

"...我该如何将JSON对象转换为Java数组"

import com.google.common.collect.Streams;

public void invoke(JsonNode event) {                 
    Streams.stream(event.withArray("x").elements())
        .forEach( num -> Logger.info(num.asDouble()) )
}

关键在于首先使用 "elements()" 方法获取 Iterator 对象,然后使用 Guava 的 "stream" 方法获取流。一旦你有了这个流,就可以进行各种数组操作(例如过滤、映射)来消耗你的数据。


1

答案大多在Jackson文档教程中;

您有几种方法可以将JsonNode转换为有用的数据。

如果您事先知道数据的结构,可以使用数据绑定方法:对于“完整”绑定,请创建与所有字段相对应的类;对于不太结构化的方法,“原始”绑定允许您使用通用对象。

否则,树模型方法应该适合您;您将在链接页面中找到的示例与您的用例相当吻合。

请尝试该示例,如果您有更具体的问题,请回来提出确切的实际或哲学问题!


1
感谢Stefano的帮助,我成功使用泛型实现了JSON节点。你让我的一周都充满了喜悦!!! - faisal abdulai
@faisalabdulai 没问题 :) 如果我的回答有帮助,请不要忘记点赞/选择它作为好的答案。如果您有有用的详细反馈想要分享,您仍然可以投票支持我的答案,但请添加您自己的答案。 - Stefano
如果您正在寻找代码示例,这里是答案https://dev59.com/I2Af5IYBdhLWcg3wylQd#35599623 - Nicholas Ng
25
因为发布了许多链接但没有快速解决方案,所以此处被投下反对票。new ObjectMapper().convertValue(jsonNode, ArrayList.class)的意思是将jsonNode转换为ArrayList的格式。 - Alex Burdusel
@AlexBurdusel 请将您的评论更新为答案。谢谢。 - HIRA THAKUR
1
@JETHALAL 现在将其添加为答案。 - Alex Burdusel

1

以下是对Stefano在被接受的回答中提到的树模型方法的快速回答:

JsonNode rootNode = new ObjectMapper().readTree(new StringReader(jsonStr));
JsonNode x=rootNode.get("x");
System.out.println(x.getNodeType());//should print: ARRAY
Iterator<JsonNode> arrayIterator=x.iterator();
List<Double> xList=new ArrayList<Double>();
while(arrayIterator.hasNext()) {
    JsonNode elementInX=arrayIterator.next();
    Double xDoubleValue=elementInX.asDouble();
    xList.add(xDoubleValue);
}
Double[] xArray=new Double[xList.size()];
xList.toArray(xArray);//xArray now should be what you want

//do the same thing to y

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接