我正在使用websocket和JsonNode播放frame framewrok 2。前端通过使用websocket连接到游戏框架后端。我将javascript数组转换为json节点,并通过使用webscoket连接将其发送到后端。 现在我的问题是如何将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]}
现在我想将这些数据放在一个数组中,以便我可以访问它们。 任何建议都将受到赞赏。另一个建议也欢迎。
答案 0 :(得分:6)
将我的评论移至答案,因为该评论获得了很多好评。
这应该执行OP所需的操作:
new ObjectMapper().convertValue(jsonNode, ArrayList.class)
答案 1 :(得分:3)
答案主要在Jackson documentation和tutorial;
您可以通过多种方式将JsonNode转换为有用的数据。
如果您事先知道数据的结构,可以使用Data Binding方法:对于“完整”绑定,使一个Class对应于所有字段);对于结构较少的方法,“原始”绑定允许您使用通用对象。
否则Tree Model方法对您有用;您将在链接页面中找到的示例与您的用例非常吻合。
请尝试这个例子,然后如果您有更具体的问题,请回到确切的实践或哲学问题!
答案 2 :(得分:1)
使用树模型快速完成此操作...将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);
答案 3 :(得分:1)
“ ......如何将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对象,然后使用番石榴“ stream”方法获取流。一旦有了流,就可以进行各种数组操作(例如过滤,映射)来消耗数据。
答案 4 :(得分:0)
Stefano在公认的答案中提到的 Tree Model方法的快速答案:
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