簡體   English   中英

將字符串轉換為數組到Observable中的對象

[英]Convert String to Array to Objects in Observable

我正在嘗試使用CloseableHttpAsyncClient從端點讀取,將字符串編組為Object(使用javax.json),然后將對象上的數組轉換為其各個組件:

CloseableHttpAsyncClient client = HttpAsyncClientBuilder.create().setDefaultCredentialsProvider(provider).build();

client.start();

Observable<ObservableHttpResponse> observable = ObservableHttp.createRequest(HttpAsyncMethods.createGet(uri), client)
            .toObservable();

Observable<JsonArray> shareable = observable.flatMap(response -> response.getContent().map(bb -> {
        String stringVal = new String(bb);
        StringReader reader = new StringReader(stringVal);
        JsonObject jobj = Json.createReader(reader).readObject();
        return jobj.getJsonArray("elements");
    })).share();

我需要獲取Json數組,然后過濾數組的對象:

Observable<JsonObject> firstStream = shareable.filter(item -> item.getString("type").equals("TYPE_1"));
Observable<JsonObject> secondStream = shareable.filter(item -> item.getString("type").equals("TYPE_2"));
Observable<JsonObject> thirdStream = shareable.filter(item -> item.getString("type").equals("TYPE_3"));

如何將Observable<JsonArray>轉換為ObservableJsonObject>

因為它是異步的,我不能使用forEach來創建某種數組來緩沖數據。

更新:

因此,使用CloseableHttpAsyncClient可能不是我想要實現的最好的解決方案 - 我今天早上(在所有事情的淋浴中)意識到我正在嘗試異步處理數據然后進行異步調用。

理想情況下,調用CloseableHttpClient(sync)並將數據傳遞給Observable進行過濾將是一種更理想的方法(我不需要第一次調用來管理多個http調用)。

    CloseableHttpClient client = HttpClientBuilder.create().setDefaultCredentialsProvider(provider).build();

    StringBuffer result = new StringBuffer();

    try {
        HttpGet request = new HttpGet(uri);
        HttpResponse response = client.execute(request);

        BufferedReader rd = new BufferedReader(
                new InputStreamReader(response.getEntity().getContent()));

        String line;
        while ((line = rd.readLine()) != null) {
            result.append(line);
        }
    } catch(ClientProtocolException cpe) { } catch(IOException ioe) {  }

    StringReader reader = new StringReader(result.toString());
    JsonObject jobj = Json.createReader(reader).readObject();
    JsonArray elements = jobj.getJsonArray("elements");

    List<JsonObject> objects = elements.getValuesAs(JsonObject.class);


    Observable<JsonObject> shareable = Observable.from(objects).share();

    Observable<JsonObject> firstStream = shareable.filter(item -> item.getString("type").equals("TYPE_1"));
    Observable<JsonObject> secondStream = shareable.filter(item -> item.getString("type").equals("TYPE_2"));
    Observable<JsonObject> thirdStream = shareable.filter(item -> item.getString("type").equals("TYPE_3"));


    firstStream.subscribe(record -> {
        //connect to SOTS/Facebook and store the results
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        Json.createWriter(baos).writeObject(record);
        System.out.println(baos.toString());
    });

    secondStream.subscribe(record -> {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        Json.createWriter(baos).writeObject(record);
        System.out.println(baos.toString());
    });

    thirdStream.subscribe(record -> {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        Json.createWriter(baos).writeObject(record);
        System.out.println(baos.toString());
    });

試試這段代碼:

    String myjson = "{\"elements\": [{\"text\":\"Obj1\"},{\"text\":\"Obj2\"}, {\"text\":\"Obj3\"}]}";

    Observable.just(myjson)
            .map(jsonStr -> new StringReader(myjson))
            .map(reader -> Json.createReader(reader).readObject())
            .map(jobj -> jobj.getJsonArray("elements"))
            .map(elements -> elements.toArray(new JsonObject[elements.size()]))
            .flatMap(jsonObjects -> Observable.from(jsonObjects))
            .subscribe(
                    (jsonObject) -> System.out.println(jsonObject.getString("text")),
                    throwable -> throwable.printStackTrace(),
                    () -> System.out.println("On complete"));

結果:

07-22 12:19:22.362 8032-8032 / com.mediamanagment.app I / System.out:Obj1
07-22 12:19:22.362 8032-8032 / com.mediamanagment.app I / System.out:Obj2
07-22 12:19:22.362 8032-8032 / com.mediamanagment.app I / System.out:Obj3

注意:
您應該使用此依賴項:

compile 'org.glassfish:javax.json:1.0.4'

而是這個:

compile 'javax.json:javax.json-api:1.0'

如果您將使用'javax.json:javax.json-api:1.0'您將獲得javax.json.JsonException: Provider org.glassfish.json.JsonProviderImpl not found在步驟中javax.json.JsonException: Provider org.glassfish.json.JsonProviderImpl not found

.map(reader -> Json.createReader(reader).readObject())

請使用'org.glassfish:javax.json:1.0.4'

更新:此外,而不是

.flatMap(jsonObjects -> Observable.from(jsonObjects))

你可以使用flatMapIterable( )

.flatMapIterable(jsonObjects -> jsonObjects)

您應該能夠使用另一個flatMap()調用而不是您正在使用的map()調用。 然后使用Observable.create()發出JsonObject

Observable<JsonObject> shareable =
        observable
                .flatMap(response -> response.getContent()
                        .flatMap(bb -> {
                            String stringVal = new String(bb);
                            StringReader reader = new StringReader(stringVal);
                            JsonObject jobj = Json.createReader(reader).readObject();
                            JsonArray elements = jobj.getJsonArray("elements");
                            return Observable.create(subscriber -> {
                                for (int i = 0; i < elements.length(); i++) {
                                    subscriber.onNext(elements.getJSONObject(i));
                                }
                                subscriber.onCompleted();
                            });
                        }))
                .share();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM