如何在Java中将对象转换为字符串

36
我有一个返回映射值(字符串)作为通用对象的函数。如何将其转换回字符串?我尝试使用toString(),但得到的只是end[Ljava.lang.String;@ff2413
public Object getParameterValue(String key)
{
    Iterator iterator=params.entrySet().iterator();

    while(iterator.hasNext())
    {
        Map.Entry me=(Map.Entry)iterator.next();
        String[] arr=(String[])me.getValue();
        log.info(me.getKey().toString()+"="+arr[0]);
    }
    if(params.containsKey(key))
    {
        log.info(key+"="+params.get(key));
        return params.get(key);
    }


    return null;
}

接收端

String temp=data.getParameterValue("request").toString();
log.info("end"+temp);

log.info(me.getKey().toString()+"="+arr[0]); 输出什么结果?

email=x@as.com
request=login
projectid=as

我已经从你的问题中删除了你的解决方案。如果你想把它作为一个“答案”发布,随意。 - Duncan Jones
11个回答

51

很抱歉,您的地图中可能包含除String对象以外的其他内容。如果您在一个String对象上调用toString(),则会获得该字符串本身。

而当您获得[Ljava.lang.String时,这表明您可能有一个字符串数组。


我编辑了我的问题部分,以展示当我遍历我的映射时得到的内容。 - AabinGunz
现在你有什么问题? - Vivien Barousse
谢谢 Vivien,你是第一个通知我们 [Ljava.lang.String 表示字符串数组的人,感谢大家的帮助 :) - AabinGunz

14

也许与上面的问题不太相关。然而,如果您正在寻找一种将Java对象序列化为字符串的方法,这可能会有所帮助。

package pt.iol.security;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import org.apache.commons.codec.binary.Base64;

public class ObjectUtil {

    static final Base64 base64 = new Base64();

    public static String serializeObjectToString(Object object) throws IOException {
        try (
                ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
                GZIPOutputStream gzipOutputStream = new GZIPOutputStream(arrayOutputStream);
                ObjectOutputStream objectOutputStream = new ObjectOutputStream(gzipOutputStream);) {
            objectOutputStream.writeObject(object);
            objectOutputStream.flush();
            return new String(base64.encode(arrayOutputStream.toByteArray()));
        }
    }

    public static Object deserializeObjectFromString(String objectString) throws IOException, ClassNotFoundException {
        try (
                ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(base64.decode(objectString));
                GZIPInputStream gzipInputStream = new GZIPInputStream(arrayInputStream);
                ObjectInputStream objectInputStream = new ObjectInputStream(gzipInputStream)) {
            return objectInputStream.readObject();
        }
    }
}

这是一段了不起的代码,它完美地解决了我的问题。非常感谢! - Jasper Holton

10

也许将其转换为JSON字符串会更有益

String jsonString = new com.google.gson.Gson().toJson(myObject);

在我的情况下,我想要将一个对象添加到响应头中,但是你不能直接将对象添加到响应头中。

因此,为了解决这个问题,我把我的对象转换成JSON字符串,在客户端上再将该字符串转换回JSON格式。


4

从输出上看,似乎你的“temp”是一个字符串数组。你需要循环遍历数组并显示每个值。


4
结果不是一个字符串,而是一个字符串数组(String[])。这就是为什么你会得到这个意外的输出。 [Ljava.lang.StringString 数组的一个签名。
System.out.println(new String[]{});

4
尽管您在这里看到了几个答案,尽管存在Object.toString方法,但问题“如何将对象转换为String”是无法回答的,或者有无限多个答案。因为所要求的是对象的某种文本表示或描述,而有无限多种可能的表示方式。每种表示方式都使用特定于对象实例的特殊语言(可能是非常有限的语言)或格式来编码。它们足以编码所有可能的对象实例。
在编写用于将对象转换为String的代码之前,必须确定要使用的语言/格式。

4
把序列化对象转换为字符串和字符串转换为对象
stringToBean(beanToString(new LoginMdp()), LoginMdp.class);

public static String beanToString(Object object) throws IOException {

    ObjectMapper objectMapper = new ObjectMapper();
    StringWriter stringEmp = new StringWriter();
    objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
    objectMapper.writeValue(stringEmp, object);
    return stringEmp.toString();
}

public static <T> T stringToBean(String content, Class<T> valueType) throws IOException {
    return new ObjectMapper().readValue(content, valueType);
}

3
解决方案1:强制类型转换
String temp=(String)data.getParameterValue("request");

解决方案2:使用类型化映射:
Map<String, String> param;

所以你需要改变函数的返回类型

public String getParameterValue(String key)
{
    if(params.containsKey(key))
    {
        return params.get(key);
    }
    return null;
}

然后就不需要进行强制类型转换或使用toString方法了。

String temp=data.getParameterValue("request");

0

toString() 是一个调试信息字符串。默认实现返回类名和系统标识哈希值。集合返回所有元素,但数组不返回。

还要注意在创建日志时可能会出现 NullPointerException!

在这种情况下,Arrays.toString() 可能会有所帮助:

Object temp = data.getParameterValue("request");
String log = temp == null ? "null" : (temp.getClass().isArray() ? Arrays.toString((Object[])temp) : temp.toString());
log.info("end " + temp);

你也可以使用 Arrays.asList()

Object temp = data.getParameterValue("request");
Object log = temp == null ? null : (temp.getClass().isArray() ? Arrays.asList((Object[])temp) : temp);
log.info("end " + temp);

这可能导致原始数组(int[],...)出现ClassCastException


0
你可以创建一个toString()方法将对象转换为字符串。
int bid;
String bname;
double bprice;

Book(String str)
{
    String[] s1 = str.split("-");
    bid = Integer.parseInt(s1[0]);
    bname = s1[1];
    bprice = Double.parseDouble(s1[2]);
}

public String toString()
{
    return bid+"-"+bname+"-"+bprice;
}   

public static void main(String[] s)
{
    Book b1 = new Book("12-JAVA-200.50");
    System.out.println(b1);
}

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