从 java 发送 hashmap 以响应本机
Sending hashmap from java to react native
我有一个包含
Map = new ConcurrentHashMap<>();
数据已归档在此地图中,我需要将更新后的地图数据发送给 React 原生 JS 桥。我怎样才能达到同样的效果?
提前致谢,
湿婆
我通常将自定义对象转换为 json 字符串,然后将其解析为 writableMap 并 return 如下所示。
@ReactMethod
public void yourBridgeMethod(final ReadableMap argument, final Promise promise) {
try {
Object x = getMapCustom;
final Gson gson = new Gson();
final String response = gson.toJson(x);
WritableMap returnMap = this.util.convertJsonToMap(new JSONObject(response));
promise.resolve(returnMap);
} catch (JSONException e) {
promise.reject("401", e.getLocalizedMessage());
}
}
您可以使用此方法创建一个实用程序 class 来处理您的转化
public WritableMap convertJsonToMap(JSONObject jsonObject) throws JSONException {
WritableMap map = new WritableNativeMap();
Iterator<String> iterator = jsonObject.keys();
while (iterator.hasNext()) {
String key = iterator.next();
Object value = jsonObject.get(key);
if (value instanceof JSONObject) {
map.putMap(key, convertJsonToMap((JSONObject) value));
} else if (value instanceof JSONArray) {
map.putArray(key, convertJsonToArray((JSONArray) value));
if (("option_values").equals(key)) {
map.putArray("options", convertJsonToArray((JSONArray) value));
}
} else if (value instanceof Boolean) {
map.putBoolean(key, (Boolean) value);
} else if (value instanceof Integer) {
map.putInt(key, (Integer) value);
} else if (value instanceof Double) {
map.putDouble(key, (Double) value);
} else if (value instanceof String) {
map.putString(key, (String) value);
} else {
map.putString(key, value.toString());
}
}
return map;
}
public WritableArray convertJsonToArray(JSONArray jsonArray) throws JSONException {
WritableArray array = new WritableNativeArray();
for (int i = 0; i < jsonArray.length(); i++) {
Object value = jsonArray.get(i);
if (value instanceof JSONObject) {
array.pushMap(this.convertJsonToMap((JSONObject) value));
} else if (value instanceof JSONArray) {
array.pushArray(convertJsonToArray((JSONArray) value));
} else if (value instanceof Boolean) {
array.pushBoolean((Boolean) value);
} else if (value instanceof Integer) {
array.pushInt((Integer) value);
} else if (value instanceof Double) {
array.pushDouble((Double) value);
} else if (value instanceof String) {
array.pushString((String) value);
} else {
array.pushString(value.toString());
}
}
return array;
}
public JSONObject convertMapToJson(ReadableMap readableMap) throws JSONException {
JSONObject object = new JSONObject();
ReadableMapKeySetIterator iterator = readableMap.keySetIterator();
while (iterator.hasNextKey()) {
String key = iterator.nextKey();
switch (readableMap.getType(key)) {
case Null:
object.put(key, JSONObject.NULL);
break;
case Boolean:
object.put(key, readableMap.getBoolean(key));
break;
case Number:
object.put(key, readableMap.getDouble(key));
break;
case String:
object.put(key, readableMap.getString(key));
break;
case Map:
object.put(key, convertMapToJson(readableMap.getMap(key)));
break;
case Array:
object.put(key, convertArrayToJson(readableMap.getArray(key)));
break;
}
}
return object;
}
public JSONArray convertArrayToJson(ReadableArray readableArray) throws JSONException {
JSONArray array = new JSONArray();
for (int i = 0; i < readableArray.size(); i++) {
switch (readableArray.getType(i)) {
case Null:
break;
case Boolean:
array.put(readableArray.getBoolean(i));
break;
case Number:
array.put(readableArray.getDouble(i));
break;
case String:
array.put(readableArray.getString(i));
break;
case Map:
array.put(convertMapToJson(readableArray.getMap(i)));
break;
case Array:
array.put(convertArrayToJson(readableArray.getArray(i)));
break;
}
}
return array;
}
我很难理解需要将 json 解析为 JavaScript 中的 ReadableMap,然后返回 Java 中的 json,副反之亦然。相反,我只是将 json 作为字符串传递。这是一种不好的做法吗?
Java脚本代码:
static methodOne(paramOne: ParamOne) {
let paramObjectAsJson = JSON.stringify(paramOne);
return Bridge.methodOne(paramObjectAsJson) as Promise<string>;
}
Java代码:
@ReactMethod
public void methodOne(final String paramObjectAsJson, final Promise promise) {
try {
ParamOneJavaClass request = fromVariantJson(paramObjectAsJson);
...
promise.resolve(null);
catch(Exception e) {
promise.reject(e.getMessage());
}
}
private ParamOneJavaClass fromVariantJson(String json) {
return createDefaultGson().fromJson(json, ParamOneJavaClass.class);
}
private static Gson createDefaultGson() {
GsonBuilder builder = new GsonBuilder();
return builder.create();
}
我有一个包含
Map
数据已归档在此地图中,我需要将更新后的地图数据发送给 React 原生 JS 桥。我怎样才能达到同样的效果?
提前致谢, 湿婆
我通常将自定义对象转换为 json 字符串,然后将其解析为 writableMap 并 return 如下所示。
@ReactMethod
public void yourBridgeMethod(final ReadableMap argument, final Promise promise) {
try {
Object x = getMapCustom;
final Gson gson = new Gson();
final String response = gson.toJson(x);
WritableMap returnMap = this.util.convertJsonToMap(new JSONObject(response));
promise.resolve(returnMap);
} catch (JSONException e) {
promise.reject("401", e.getLocalizedMessage());
}
}
您可以使用此方法创建一个实用程序 class 来处理您的转化
public WritableMap convertJsonToMap(JSONObject jsonObject) throws JSONException {
WritableMap map = new WritableNativeMap();
Iterator<String> iterator = jsonObject.keys();
while (iterator.hasNext()) {
String key = iterator.next();
Object value = jsonObject.get(key);
if (value instanceof JSONObject) {
map.putMap(key, convertJsonToMap((JSONObject) value));
} else if (value instanceof JSONArray) {
map.putArray(key, convertJsonToArray((JSONArray) value));
if (("option_values").equals(key)) {
map.putArray("options", convertJsonToArray((JSONArray) value));
}
} else if (value instanceof Boolean) {
map.putBoolean(key, (Boolean) value);
} else if (value instanceof Integer) {
map.putInt(key, (Integer) value);
} else if (value instanceof Double) {
map.putDouble(key, (Double) value);
} else if (value instanceof String) {
map.putString(key, (String) value);
} else {
map.putString(key, value.toString());
}
}
return map;
}
public WritableArray convertJsonToArray(JSONArray jsonArray) throws JSONException {
WritableArray array = new WritableNativeArray();
for (int i = 0; i < jsonArray.length(); i++) {
Object value = jsonArray.get(i);
if (value instanceof JSONObject) {
array.pushMap(this.convertJsonToMap((JSONObject) value));
} else if (value instanceof JSONArray) {
array.pushArray(convertJsonToArray((JSONArray) value));
} else if (value instanceof Boolean) {
array.pushBoolean((Boolean) value);
} else if (value instanceof Integer) {
array.pushInt((Integer) value);
} else if (value instanceof Double) {
array.pushDouble((Double) value);
} else if (value instanceof String) {
array.pushString((String) value);
} else {
array.pushString(value.toString());
}
}
return array;
}
public JSONObject convertMapToJson(ReadableMap readableMap) throws JSONException {
JSONObject object = new JSONObject();
ReadableMapKeySetIterator iterator = readableMap.keySetIterator();
while (iterator.hasNextKey()) {
String key = iterator.nextKey();
switch (readableMap.getType(key)) {
case Null:
object.put(key, JSONObject.NULL);
break;
case Boolean:
object.put(key, readableMap.getBoolean(key));
break;
case Number:
object.put(key, readableMap.getDouble(key));
break;
case String:
object.put(key, readableMap.getString(key));
break;
case Map:
object.put(key, convertMapToJson(readableMap.getMap(key)));
break;
case Array:
object.put(key, convertArrayToJson(readableMap.getArray(key)));
break;
}
}
return object;
}
public JSONArray convertArrayToJson(ReadableArray readableArray) throws JSONException {
JSONArray array = new JSONArray();
for (int i = 0; i < readableArray.size(); i++) {
switch (readableArray.getType(i)) {
case Null:
break;
case Boolean:
array.put(readableArray.getBoolean(i));
break;
case Number:
array.put(readableArray.getDouble(i));
break;
case String:
array.put(readableArray.getString(i));
break;
case Map:
array.put(convertMapToJson(readableArray.getMap(i)));
break;
case Array:
array.put(convertArrayToJson(readableArray.getArray(i)));
break;
}
}
return array;
}
我很难理解需要将 json 解析为 JavaScript 中的 ReadableMap,然后返回 Java 中的 json,副反之亦然。相反,我只是将 json 作为字符串传递。这是一种不好的做法吗?
Java脚本代码:
static methodOne(paramOne: ParamOne) {
let paramObjectAsJson = JSON.stringify(paramOne);
return Bridge.methodOne(paramObjectAsJson) as Promise<string>;
}
Java代码:
@ReactMethod
public void methodOne(final String paramObjectAsJson, final Promise promise) {
try {
ParamOneJavaClass request = fromVariantJson(paramObjectAsJson);
...
promise.resolve(null);
catch(Exception e) {
promise.reject(e.getMessage());
}
}
private ParamOneJavaClass fromVariantJson(String json) {
return createDefaultGson().fromJson(json, ParamOneJavaClass.class);
}
private static Gson createDefaultGson() {
GsonBuilder builder = new GsonBuilder();
return builder.create();
}