web-dev-qa-db-ja.com

JsonNodeをJava配列に変換する

私は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]}

次に、これらのデータにアクセスできるように、これらのデータを配列に配置します。任意の提案を歓迎します。別の提案も歓迎します。

11
faisal abdulai

答えは主に ジャクソンのドキュメントチュートリアル にあります。

そのJsonNodeを有用なデータに変換する方法はいくつかあります。

データの構造を事前に知っている場合は、 データバインディング アプローチを使用できます。「完全な」バインディングの場合は、すべてのフィールドに対応するクラスを作成します。構造化されていないアプローチの場合、「raw」バインディングを使用すると、ジェネリックオブジェクトを使用できます。

それ以外の場合は、 ツリーモデル アプローチが機能するはずです。リンク先のページにある例は、ユースケースに非常によく対応しています。

その例を試してみてください。より具体的な問題がある場合は、正確な実用的または系統学的な問題を返してください。

1
Stefano

たくさんの賛成を得たので、私のコメントを答えに移しました。

これにより、OPが必要とすることを実行できます。

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

19
Alex Burdusel

ツリーモデルを使用してこれを行う簡単な方法... 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
DanJ

「... 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」メソッドを使用してストリームを取得することです。ストリームを取得したら、あらゆる種類の配列操作(フィルター、マップなど)を実行してデータを消費できます。

1
Wildhammer

ツリーモデルアプローチのクイックアンサーは、受け入れられたアンサーで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
0
ZhaoGang