我的 Android 应用程序中有以下 Java 代码,并且想要一种将 Java 列表转换为可在 javascript 中使用的数组的方法:
Java:
public void onCompleted(List<GraphUser> users, Response response) {
for(int i = 0; i < users.size(); i++)
{
//add to an array object that can be used in Javascript
webView.loadUrl("javascript:fetchFriends(arrObj)");
}
}
Javascript:
//this is how I want to be able to use the object in Javascript
function parseFriends(usersObjectFromJava){
var users = [];
for (var i = 0; i < usersObjectFromJava.length; i++) {
var u = {
Id: usersObjectFromJava[i].id + "",
UserName: usersObjectFromJava[i].username,
FirstName: usersObjectFromJava[i].first_name,
LastName: usersObjectFromJava[i].last_name,
};
users[i] = u;
}
}
有人可以帮我用 Java 代码创建 usersObjectFromJava 以便它可以在 javascript 中使用吗?
使用GSON 要将java对象转换为JSON字符串,你可以通过
来完成Gson gson = new Gson();
TestObject o1 = new TestObject("value1", 1);
TestObject o2 = new TestObject("value2", 2);
TestObject o3 = new TestObject("value3", 3);
List<TestObject> list = new ArrayList<TestObject>();
list.add(o1);
list.add(o2);
list.add(o3);
gson.toJson(list)会给你
[{"prop1":"value1","prop2":1}, {"prop1":"value2","prop2":2}, {“prop1”:“value3”,“prop2”:3}]
现在您可以使用 JSON.parse(),将 JSON 反序列化为 Javascript 对象。
我假设这样做:
Java:
public void onCompleted(List<GraphUser> users, Response response) {
JSONArray arr = new JSONArray();
JSONObject tmp;
try {
for(int i = 0; i < users.size(); i++) {
tmp = new JSONObject();
tmp.put("Id",users.get(i).id); //some public getters inside GraphUser?
tmp.put("Username",users.get(i).username);
tmp.put("FirstName",users.get(i).first_name);
tmp.put("LastName",users.get(i).last_name);
arr.add(tmp);
}
webView.loadUrl("javascript:fetchFriends("+arr.toString()+")");
} catch(JSONException e){
//error handling
}
}
JavaScript:
function fetchFriends(usersObjectFromJava){
var users = usersObjectFromJava;
}
您必须稍微更改 Java 代码(即使用公共 getter 或向
JSONObjects
添加更多/更少的信息)。
JSON
默认包含在 Android 中,因此不需要外部库。
我希望我理解你的问题。
我遇到的一件小事:你在Java中使用
fetchFriends
,但在Javascript中称为parseFriends
,我将它们重命名为fetchFriends
您可以使用Gson库。
Gson gson = new GsonBuilder().create();
JsonArray jsonArray = gson.toJsonTree(your_list, TypeClass.class).getAsJsonArray();
http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/Gson.html
使用杰克逊。 您需要向要传递的 POJO 的每个属性添加“@JsonProperty”注释,然后执行如下操作:
String respStr = "";
for(Object whatever: MyList)
{
JSONObject dato = new JSONObject();
dato.put("FirstField", whatever.SomeData());
dato.put("SecondField", whatever.SomeData2());
StringEntity entity = new StringEntity(dato.toString());
post.setEntity(entity);
webView.loadUrl("javascript:fetchFriends("+entity+")");
}
我不确定为什么没有提到关于
jaxb
的答案。我只是认为 jaxb
非常适合此类问题...
有关带注释的
jaxb
类的示例样式,请找到此。
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class ResponseAsList {
private List < Object > list = new ArrayList < Object > ();
public ResponseAsList() {
// private default constructor for JAXB
}
public List < Object > getList() {
return list;
}
public void setList(List < Object > list) {
this.list = list;
}
}
您将数据填充到这些列表中,并且您将
marshal
放入 xml
或 json
中。在您向客户提供 json
后,您可以执行 var myArray = JSON.parse(response);
...
虽然我通常主张使用 GSON 或 Jackson 之类的东西来为您进行 JSON 转换,但如果您处于有限的环境(如 Android)并且不想捆绑一堆依赖项,那么您自己的转换非常容易。
public class JsonHelper {
public static String convertToJSON(List<GraphUser> users) {
StringBuilder sb = new StringBuilder();
for (GraphUser user : users) {
sb.append(convertToJSON(user));
}
return sb.toString();
}
public static String convertToJSON(GraphUser user) {
return new StringBuilder()
.append("{")
.append("\"id\":").append(user.getId()).append(",")
.append("\"admin\":").append(user.isAdmin() ? "true" : "false").append(",")
.append("\"name\":\"").append(user.getName()).append("\",")
.append("\"email\":\"").append(user.getEmail()).append("\"")
.append("}")
.toString();
}
}
如果您愿意,您显然可以在
toJSON()
上创建一个 GraphUser
方法来放置逻辑。或者使用可注入的 json 帮助程序库而不是静态方法(我会)。或任意数量的其他抽象。许多开发人员喜欢将模型对象的表示分离到他们自己的对象中,包括我自己。就我个人而言,如果我想避免依赖关系,我可能会像这样建模:
interface Marshaller<F,T>
,使用方法 T marshall(F obj)
和 F unmarshall(T obj)
interface JsonMarshaller<F> extends Marshaller<String>
class GraphUserMarshaller implements JsonMarshaller<GraphUser>
class GraphUserCollectionMarshaller implements JsonMarshaller<Collection<GraphUser>>
可以进行类型检查或使用访问者模式或其他方式来确定表示此类对象集合的最佳方式。在此过程中,我确信您会发现一些重复的代码可以提取到超类或复合类,特别是当您开始以这种方式对集合编组器进行建模时。尽管这可能会变得相当冗长(且乏味),但它在您想要限制所依赖的库数量的资源受限环境中特别有效。
您可以使用 Google Gson 库 (http://code.google.com/p/google-gson/) 将 Java 列表对象转换为 JSON。确保设置了正确的字段,如 ID、UserName、FirstName 等,并且在 Java 脚本端,相同的代码可以工作。
这只是一个例子,首先添加javascript接口。它将成为 javascript 和 java 代码之间的桥梁。 webView.addJavascriptInterface(new JSInterface(), "界面");
在 javascript 中你可以像这样添加,
"window.interface.setPageCount(pageCount1);"
interface是java和javascript的共同关键字。创建一个类 JSInterace 并定义一个方法 setPageCount(int a)。该脚本将返回一个值,您可以在 java 方法中使用该值