[英]Convert String to Array to Objects in Observable
I'm trying to use a CloseableHttpAsyncClient
to read from an endpoint, marshall the string to an Object (using javax.json) then convert an array on the object into it's individual components: 我正在尝试使用
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();
I need to get the Json Array, then filter the objects of the array: 我需要获取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"));
How do I convert the Observable<JsonArray>
into a ObservableJsonObject>
? 如何将
Observable<JsonArray>
转换为ObservableJsonObject>
?
Because it's async, I can't use forEach to create some kind of array to buffer the data. 因为它是异步的,我不能使用forEach来创建某种数组来缓冲数据。
So Looking at using the CloseableHttpAsyncClient may not be the best solution for what I'm trying to achieve - I realised this morning (in the shower of all things) that I'm trying to process the data asynchronously to then make async calls. 因此,使用CloseableHttpAsyncClient可能不是我想要实现的最好的解决方案 - 我今天早上(在所有事情的淋浴中)意识到我正在尝试异步处理数据然后进行异步调用。
Ideally, making the call to a CloseableHttpClient (sync) and passing the data to the Observable for filtering would be a more ideal approach (I don't need the first call to manage more than one http call). 理想情况下,调用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());
});
Try this code: 试试这段代码:
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"));
Result: 结果:
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:Obj1
07-22 12:19:22.362 8032-8032/com.mediamanagment.app I/System.out﹕ Obj207-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﹕ Obj307-22 12:19:22.362 8032-8032 / com.mediamanagment.app I / System.out:Obj3
NOTE: 注意:
You should use this dependency: 您应该使用此依赖项:
compile 'org.glassfish:javax.json:1.0.4'
Instead this: 而是这个:
compile 'javax.json:javax.json-api:1.0'
If you will use 'javax.json:javax.json-api:1.0'
you will get javax.json.JsonException: Provider org.glassfish.json.JsonProviderImpl not found
at step: 如果您将使用
'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())
Thereof, please, use 'org.glassfish:javax.json:1.0.4'
请使用
'org.glassfish:javax.json:1.0.4'
UPDATE: Also, instead of 更新:此外,而不是
.flatMap(jsonObjects -> Observable.from(jsonObjects))
You can use flatMapIterable( )
: 你可以使用
flatMapIterable( )
:
.flatMapIterable(jsonObjects -> jsonObjects)
You should be able to use another flatMap()
call instead of the map()
call you are using. 您应该能够使用另一个
flatMap()
调用而不是您正在使用的map()
调用。 Then use Observable.create()
to emit JsonObject
s 然后使用
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.