将Java List转换成Javascript数组

7
我是一名有用的助手,可以将文本翻译成中文。
以下是我的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中使用吗?

2
我可能错了,因为我对JS不是很熟悉,但我认为你可以在Java中创建一个JSON数组,然后轻松地在JS中读取它?http://json.org/javadoc/org/json/JSONArray.html - Embattled Swag
你的问题没有足够的信息来回答。你是如何在Java和Javascript之间进行通信的? - Tim B
@prabhu 我没有看到任何更新。 - Tim B
@TimB 嗯,可能没有保存。已经更新了,现在你能看到吗? - Prabhu
@TimB 没问题,谢谢。 - Prabhu
显示剩余5条评论
8个回答

11

使用 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":2},{"prop1":"value2","prop2":2},{"prop1":"value3","prop2":3}]

现在,您可以使用JSON.parse()将其从JSON反序列化为JavaScript对象。


7

I would assume doing this:

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。

目前正在测试中,测试结果会及时告知您! - Prabhu
1
这个可行。我必须在JavaScript中这样做才能使它工作:var users = JSON.parse(JSON.stringify(userObjectsFromJava)); - Prabhu
@bbuecherl 我遇到了类似 JSON 的问题,请问您能否解决一下? http://stackoverflow.com/questions/37945432/how-to-give-java-arraylist-to-javascript-function-using-json - FIFA oneterahertz

1

1
使用Jackson。 您需要在要传递的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+")");
        }

1
我不确定为什么没有回答提到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;
    }

}

你将把数据存储在这些列表中,并使用xmljson marshal。当您向客户端传递一个json后,您可以执行var myArray = JSON.parse(response);...

1
尽管我通常建议使用类似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();
  }
}

你可以在 GraphUser 上明显地制作一个 toJSON() 方法来放置逻辑,如果你喜欢的话。或者使用可注入的 json 帮助库而不是静态方法(我会这样做)。或者任何数量的其他抽象。许多开发人员更喜欢将模型对象的表示分离到它们自己的对象中,包括我自己。如果我想避免依赖关系,我可能会将其建模为这样的东西:
  • interface Marshaller<F,T>,具有方法 T marshall(F obj)F unmarshall(T obj)
  • interface JsonMarshaller<F> 扩展了 Marshaller<String>
  • class GraphUserMarshaller implements JsonMarshaller<GraphUser>
  • class GraphUserCollectionMarshaller implements JsonMarshaller<Collection<GraphUser>>,它可以执行类型检查或使用访问者模式或其他方式来确定表示此类型对象集合的最佳方法。
沿途,我相信你会发现一些重复的代码需要提取到超类或组合类中,特别是当你开始以这种方式建模集合编组器时。虽然这可能会变得非常冗长(和乏味),但它在资源受限环境中特别有效,因为你想限制所依赖的库的数量。

0
你可以使用Google Gson库(http://code.google.com/p/google-gson/)将Java List对象转换为JSON。确保正确设置ID、UserName、FirstName等字段,并且在JavaScript端相同的代码也能正常工作。

-1

这只是一个例子,首先添加JavaScript接口。它将成为JavaScript和Java代码之间的桥梁。 webView.addJavascriptInterface(new JSInterface(), "interface");

在JavaScript中,您可以像这样添加:

     "window.interface.setPageCount(pageCount1);"

“Interface(接口)”这个关键字在Java和JavaScript中是通用的。创建一个名叫JSInterface的类并定义一个方法setPageCount(int a)。脚本将返回一个值,你可以在Java方法中使用该值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接