私はwebsocketとJsonNodeを使用してPlayframewrok2に取り組んでいます。フロントエンドは、WebSocketを使用してPlayFrameworkバックエンドに接続されています。 javascript配列をjsonノードに変換し、webscoket接続を使用してバックエンドに送信しました。今私の問題は、jsonオブジェクトをa 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());
}
ログを確認すると、メッセージが配信されます:以下はログ情報[情報]アプリケーションです-
{"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]}
次に、これらのデータにアクセスできるように、これらのデータを配列に配置します。任意の提案を歓迎します。別の提案も歓迎します。
答えは主に ジャクソンのドキュメント と チュートリアル にあります。
そのJsonNodeを有用なデータに変換する方法はいくつかあります。
データの構造を事前に知っている場合は、 データバインディング アプローチを使用できます。「完全な」バインディングの場合は、すべてのフィールドに対応するクラスを作成します。構造化されていないアプローチの場合、「raw」バインディングを使用すると、ジェネリックオブジェクトを使用できます。
それ以外の場合は、 ツリーモデル アプローチが機能するはずです。リンク先のページにある例は、ユースケースに非常によく対応しています。
その例を試してみてください。より具体的な問題がある場合は、正確な実用的または系統学的な問題を返してください。
たくさんの賛成を得たので、私のコメントを答えに移しました。
これにより、OPが必要とすることを実行できます。
new ObjectMapper().convertValue(jsonNode, ArrayList.class)
ツリーモデルを使用してこれを行う簡単な方法... 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);
「... jsonオブジェクトをJava array」に変換するにはどうすればよいですか?」
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」メソッドを使用してストリームを取得することです。ストリームを取得したら、あらゆる種類の配列操作(フィルター、マップなど)を実行してデータを消費できます。
ツリーモデルアプローチのクイックアンサーは、受け入れられたアンサーで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