将字符串转换为类对象 [关闭]

Posted

技术标签:

【中文标题】将字符串转换为类对象 [关闭]【英文标题】:Convert String into a Class Object [closed] 【发布时间】:2011-07-21 01:31:30 【问题描述】:

我使用toString() 方法将一个类对象存储到一个字符串中。现在,我想将字符串转换为该类对象。

如何做到这一点?请帮我提供源代码。

【问题讨论】:

【参考方案1】:

你可能想用 json 来做。 将您的 bean(*) 转换为 json 然后返回。 这个过程称为序列化和反序列化 阅读它here

(*) 不要只使用成员作为数据源,为对象中的每个成员构建 getter 和 setter。

【讨论】:

【参考方案2】:

更简单的方法: 您将需要 com.google.gson.Gson 将对象转换为 json 字符串以进行流式传输

将对象转换为 json 字符串以便在下面的代码中流式使用

Gson gson = new Gson();
String jsonString = gson.toJson(MyObject);

要将 json 字符串转换回对象,请使用以下代码:

Gson gson = new Gson();
MyObject = gson.fromJson(decodedString , MyObjectClass.class);

将对象转换为流式传输并在另一侧读取的更简单的方法。 希望这可以帮助。 - Vishesh

【讨论】:

太棒了! @user2516769,很好的答案!它拯救了我的一天,解决了我的大问题。 @user2516769 这是一个非常聪明的简单方法。 :)【参考方案3】:

我正在使用 toString() 方法将类对象存储到字符串中。现在,我想将字符串转换为该类对象。

首先,如果我理解您的问题,您希望将对象存储到字符串中,然后再读取它并重新创建对象。

就我个人而言,当我需要这样做时,我会使用 ObjectOutputStream。但是,有一个强制性条件。您要转换为 String 然后再转换回 Object 的对象必须是 Serializable 对象,以及它的所有属性。

让我们考虑ReadWriteObject,要操纵的对象和ReadWriteTest 操纵器。

我会这样做:

public class ReadWriteObject implements Serializable 

    /** Serial Version UID */
    private static final long serialVersionUID = 8008750006656191706L;

    private int age;
    private String firstName;
    private String lastName;

    /**
     * @param age
     * @param firstName
     * @param lastName
     */
    public ReadWriteObject(int age, String firstName, String lastName) 
        super();
        this.age = age;
        this.firstName = firstName;
        this.lastName = lastName;
    

    /*
     * (non-Javadoc)
     * 
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() 
        return "ReadWriteObject [age=" + age + ", firstName=" + firstName + ", lastName=" + lastName + "]";
    




public class ReadWriteTest 

    public static void main(String[] args) throws IOException, ClassNotFoundException 
        // Create Object to write and then to read
        // This object must be Serializable, and all its subobjects as well
        ReadWriteObject inputObject = new ReadWriteObject(18, "John", "Doe");

        // Read Write Object test

        // Write Object into a Byte Array
        ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(inputObject);
        byte[] rawData = baos.toByteArray();
        String rawString = new String(rawData);
        System.out.println(rawString);

        // Read Object from the Byte Array
        byte[] byteArrayFromString = rawString.getBytes();
        ByteArrayInputStream bais = new ByteArrayInputStream(byteArrayFromString);
        ObjectInputStream ois = new ObjectInputStream(bais);
        Object outputObject = ois.readObject();
        System.out.println(outputObject);
    

标准输出与此类似(实际上,我无法复制/粘贴):

¬í ?sr ?*com.ajoumady.***.ReadWriteObjecto$˲é¦LÚ ?I ?ageL ?firstNamet ?Ljava/lang/String;L ?lastNameq ~ ?xp ?t ?John ?Doe

ReadWriteObject [age=18, firstName=John, lastName=Doe]

【讨论】:

【参考方案4】:

我正在使用 toString() 方法将类对象存储到字符串中。现在,我想将字符串转换为该类对象。

您的问题模棱两可。这可能意味着至少两件不同的事情,其中​​一件是……嗯……对你来说是一个严重的误解。


如果你这样做了:

SomeClass object = ...
String s = object.toString();

那么答案是没有简单的方法可以将s 转回SomeClass 的实例。即使toString() 方法为您提供了那些时髦的“SomeClass@xxxxxxxx”字符串之一,您也无法做到这一点。 (该字符串不编码对象的状态,甚至不编码对象的引用。xxxxxxxx 部分是对象的身份哈希码。它不是唯一的,不能神奇地变回引用到对象。)

toString 的输出转换回对象的唯一方法是:

编码SomeClass.toString() 方法,以便在它生成的字符串中包含对象的所有相关状态,并且 编写一个构造函数或工厂方法,以toString() 方法生成的格式显式解析字符串。

这可能是一个不好的方法。当然,为非平凡的类做这件事需要做很多工作。


如果你做了这样的事情:

SomeClass object = ...
Class c = object.getClass();
String cn = c.toString();

然后你可以得到相同的Class对象(即c中的那个),如下所示:

Class c2 = Class.forName(cn);

这为您提供了Class,但没有神奇的方法可以使用它来重建原始实例。 (很明显,类名中不包含对象的状态。)


如果您正在寻找一种方法来序列化/反序列化任意对象 而无需自己编写 unparse / parse 方法,那么您不应该完全使用toString() 方法。以下是您可以使用的一些替代方案:

@Nishant 答案中的链接中描述的 Java 对象序列化 API。 @fatnjazzy 的回答中描述的 JSON 序列化。 像 XStream 这样的 XML 序列化库。 ORM 映射。

这些方法中的每一种都有优点和缺点......我不会在这里讨论。

【讨论】:

【参考方案5】:

正如其他人所说,您的问题充其量是模棱两可的。问题是,您希望将对象表示为字符串,然后能够从该字符串再次构造对象。

但是,请注意,虽然 Java 中的许多对象类型都有字符串表示,但这并不能保证可以从其字符串表示中构造对象。

引用this source,

对象序列化是将对象的状态保存到字节序列的过程,以及在将来某个时间将这些字节重建为活动对象的过程。

所以,你看,你想要的可能是不可能的。但是可以将对象的状态保存到字节序列中,然后从该字节序列中重构它。

【讨论】:

【参考方案6】:

你可以使用语句:-

Class c = s.getClass();

获取类实例。

【讨论】:

【参考方案7】:
Class.forName(nameString).newInstance();

【讨论】:

不反对,但似乎 OP 想要将对象(带有状态)保存作为字符串,然后转换回具有相同状态的对象。 forName 加载类并为您提供 Class 对象而不是类的实例。 download.oracle.com/javase/6/docs/api/java/lang/…【参考方案8】:

您不能使用 toString() 将类对象存储到字符串中,toString() 只会以您想要的任何方式返回对象的字符串表示形式。您可能想阅读一下Serialization。

【讨论】:

【参考方案9】:

继续我的评论。 toString 不是解决方案。一些优秀的灵魂已经为 Java 中的对象的序列化和反序列化编写了完整的代码。见这里:http://www.javabeginner.com/uncategorized/java-serialization

建议阅读:

    又老又好Java Technical Article on Serialization http://java.sun.com/developer/technicalArticles/ALT/serialization/ http://java.sun.com/developer/onlineTraining/Programming/BasicJava2/serial.html

【讨论】:

以上是关于将字符串转换为类对象 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Python爬虫编程思想(79): 将JSON字符串转换为类实例

Python爬虫编程思想(79): 将JSON字符串转换为类实例

我必须将记录结构转换为类,并且不断收到多个错误[关闭]

JavaScriptSerializer 不会将 Json 字符串转换为对象? [关闭]

C++类型转换函数

打字稿:将 JSON 对象转换为类/接口对象