简体   繁体   English

Java JSONObject值强制转换为User

[英]Java JSONObject value cast to User

I don't know that how can I do that Server send to client JSONObject . 我不知道该如何将服务器发送到客户端JSONObject JSONObject has User but when Client get it then I can't cast to User. JSONObject有User,但是当Client获得它时,我无法转换为User。 I tried that I send list but the JSONObject doesn't let me. 我试过发送列表,但是JSONObject不允许我发送。

Is it possible that I put User into JSONObject and after Client read it and cast to User ? 是否可以将User放入JSONObject中,并在Client读取后将其强制转换为User? And what list has user and list put into JSONObject ? 用户和列表放到JSONObject中的是什么列表?

Exception: Exception in thread "Thread-4" java.lang.ClassCastException: java.lang.String cannot be cast to application.User 异常: Exception in thread "Thread-4" java.lang.ClassCastException: java.lang.String cannot be cast to application.User

Server.java : Server.java:

message = new SerializableJSONObject(new JSONObject());
        message.getJSONObject().put("action", "friendsList");
        List<User> list = new ArrayList<User>();
        for (String s : userDatabase.getFriends(email)) {
            User u = server.getUser(s);
            if (u == null) {
                u = userDatabase.getFriendData(s);
            }else {
                u = u.getUser(); // getUser doesn't have Socket
                System.out.println(u.getEmail() +" -> "+u.getOutput() + ", "+u.getInput());
            }
            message.getJSONObject().put(email, u);

        }
        //message.getJSONObject().put("list", list);
        message.writeObject(out);

Cleint.java : Cleint.java:

while(true) {
            json.readJSONObject(in);
            System.out.println("Receive: "+json.getJSONObject().get("action"));
            switch (json.getJSONObject().getString("action")) {
            case "login":
                LoginController.receiveMessage(json.getJSONObject());
                break;
            case "friendsList":
                List<User> list = new ArrayList<>();
                //SerializableJSONArray mA = (SerializableJSONArray)json.getJSONObject().get("list");
                //System.out.println(mA.getJSONArray().get(0));
                Iterator<String> keys = json.getJSONObject().keys();
                while(keys.hasNext()) {
                    String key = (String) keys.next();
                    System.out.println(json.getJSONObject().get(key));
                    list.add((User) json.getJSONObject().get(key));
                }
                MainController.addFrriendsList(list);
                break;
            default:
                break;
            }

        }

SerializableJSONObject.java : SerializableJSONObject.java:

public class SerializableJSONObject implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = 11;


private transient JSONObject json;

public SerializableJSONObject(JSONObject json) {
    this.json = json;
}

public JSONObject getJSONObject() {
    return json;
}

public void writeObject(ObjectOutputStream out) throws IOException {
    out.writeObject(json.toString());
}

public void readJSONObject(ObjectInputStream in) throws ClassNotFoundException, IOException, JSONException {
    json = new JSONObject((String) in.readObject());


}
}

User.java : User.java:

public class User implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = 11;

private String email;
private String name;
private Status status;
private ObjectOutputStream out;
private ObjectInputStream in;


public User(ObjectOutputStream out, ObjectInputStream in) {
    super();
    this.out = out;
    this.in = in;
}

public User(String email, String name, Status status, ObjectOutputStream out, ObjectInputStream in) {
    super();
    this.email = email;
    this.name = name;
    this.status = status;
    this.out = out;
    this.in = in;
}

public User(String email, String name, Status status) {
    super();
    this.email = email;
    this.name = name;
    this.status = status;
}

public String getEmail() {
    return email;
}

public String getName() {
    return name;
}

public Status getStatus() {
    return status;
}

public void setStatus(Status status) {
    this.status = status;
}

public ObjectOutputStream getOutput() {
    return out;
}

public ObjectInputStream getInput() {
    return in;
}

public User getUser() {
    return new User(getEmail(), getName(), getStatus());
}

In Server.java: 在Server.java中:

List<User> list = new ArrayList<User>();
//...
//message.getJSONObject().put("list", list); //list has type List<User>
//..

In Client.java 在Client.java中

//...
//SerializableJSONArray mA = (SerializableJSONArray)json.getJSONObject().get("list");
//here list is of type List<User> not SerializableJSONArray
//...
//List<User> is not convertable to SerializableJSONArray.

Maybe you should construct a jsonArray from your ArrayList in Server.java first and then put it in the jsonObject Map. 也许您应该首先从Server.java中的ArrayList构造一个jsonArray,然后将其放入jsonObject Map中。

I hope it helps. 希望对您有所帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM