当前位置: 首页 > 知识库问答 >
问题:

格森。toJson(对象)返回对象哈希代码

袁阿苏
2023-03-14

我正在尝试使用Gson转换下面的这个类。ToJson(Object)方法,但它正在重新生成类的对象哈希代码,例如:br.com.helpradar.entity.User@475fdaaa

但是,我可以检索用户。没有任何问题和所有关系的专业知识:Gson。ToJson(user.getExperience)

@Entity
@SequenceGenerator(name="seqUser", sequenceName="SEQ_USER", allocationSize=1)
public class User {
@Id
private Long id;

@Column(nullable=false)
private String name;

@OneToOne
private Contact contact;

//enum
private TypeUser typeUser;

@ManyToMany(cascade = { CascadeType.ALL })  
@JoinTable(name = "USER_REVIEW", 
joinColumns = { @JoinColumn(name = "USER_ID") },
inverseJoinColumns = { @JoinColumn(name = "REVIEW_ID") })  
@Column(name="REVIEW")
private Set<Review> review= new HashSet<Review>();

@ManyToMany(cascade = { CascadeType.ALL })  
@JoinTable(name = "USER_EXPERTISE", 
joinColumns = { @JoinColumn(name = "USER_ID") },
inverseJoinColumns = { @JoinColumn(name = "EXPERTISE_ID") })  
@Column(name="EXPERTISE")
private Set<Expertise> expertise = new HashSet<Expertise>();
}

这是我的Gson方法:

Gson gson = new GsonBuilder()
    .registerTypeAdapter(User.class, new MyTypeAdapter<Expertise>())
    .registerTypeAdapter(User.class, new MyTypeAdapter<Review>())

    .create();

return gson.toJson(user);

这是我的MyTypeAdapter:

class MyTypeAdapter<T> extends TypeAdapter<T> {
public T read(JsonReader reader) throws IOException {
    return null;
}

public void write(JsonWriter writer, T obj) throws IOException {
    if (obj == null) {
        writer.nullValue();
        return;
    }
    writer.value(obj.toString());
}

}

那么,如何让Gson. ToJson(用户)实际返回一个Json字符串,以便我可以使用Gson. FromJson在我的另一端?提前谢谢。

共有1个答案

归鹤龄
2023-03-14

我认为您需要使用方法enableComplexMapKeySerialization()。在这里,您可以看到下一个文档:

public GsonBuilder enableComplexMapKeySerialization()

Enabling this feature will only change the serialized form if the map 
key is a complex type (i.e. non-primitive) in its serialized JSON form. 
The default implementation of map serialization uses toString() on the key...

例如:

Gson gson = new GsonBuilder()
   .register(Point.class, new MyPointTypeAdapter())
   .enableComplexMapKeySerialization()
   .create();

Map<Point, String> original = new LinkedHashMap<Point, String>();
original.put(new Point(5, 6), "a");
original.put(new Point(8, 8), "b");
System.out.println(gson.toJson(original, type));

输出将是:

{
     "(5,6)": "a",
     "(8,8)": "b"
}

所以,你可以这样尝试:

Gson gson = new GsonBuilder()
.registerTypeAdapter(User.class, new MyTypeAdapter<Expertise>())
.registerTypeAdapter(User.class, new MyTypeAdapter<Review>())
.enableComplexMapKeySerialization()
.create();
 类似资料:
  • 当我将Object转换为Json时,我遇到了大十进制精度丢失的问题。 假设我有Pojo类, 现在我将值设置为Pojo,然后转换为JSON 第一次测试-正确输出 第二次测试-输出错误(失去BigDecimal精度) 第三次测试-输出错误(失去BigDecimal精度) 令人惊讶的是,每当BigDecimal值的长度更大时,它也会截断小数点。json转换有什么问题。你能给我提供解决方案吗?

  • 用户错误报告显示偶尔会返回,但对于大多数用户来说,它工作正常。 我访问了一位用户,他在手机上遇到了错误并调试了应用程序,我制作了来显示发送到服务器的内容,我看到Toast显示了,并且记录和ID不是。 这是我所做的。 这里我做序列化对象 但是)对于一些用户来说是正确的,但是对于一些用户来说返回 服务器数据库显示一些用户发送了数据,但一些用户发送了正确的json。经过一些研究,我发现了新的Gson()

  • 我的业务规则是,如果第一个、最后一个和中间字段都相等,或者如果第一个和最后一个字段相等,并且其中一个(或两个)对象的中间字段为null,则两个Name对象被视为相等。 因此,在为我的Name类实现hash和equals方法时,我可以使用这样的用例:equals为两个对象返回true,但这两个对象的hash返回不同的值(因为一个对象的middle值为null值,而另一个对象的middle值为null

  • 问题内容: 使用hashmap而不是使用对象类好吗……使用Hashmap…。 并使用对象类..... 请在应用程序运行状况,内存要求等方面告诉我… 问题答案: 这在很大程度上取决于您要实现的目标:为了提高灵活性,哈希映射会更好。但是灵活性是有代价的:哈希映射比具有相同数量的强类型字段的类还要大和慢。 哈希映射比具有相同数量字段的类具有更大的内存占用量 哈希图会强制对基元进行装箱 哈希图的创建和访问

  • 问题内容: 我需要一个Python / C / C ++ / Java实现,可以 暂停散列进步 和 商店 ,在这样一个文件进度的进展是 可恢复 从该文件在稍后阶段。 无论上面列出的是哪种语言编写的,它都应该可以在Python中正常工作。建议您提供它以便与“ hashlib”一起良好地工作,但这不是必需的。同样,如果已经存在这样的事物,那么到此的链接就足够了。 对于一个想法 ,您的实现应该实现什么。

  • 问题内容: 我了解为什么将可变对象放入字典很危险。但是,将所有列表/集合转换为元组/ frozensets是昂贵的;对于许多类型,根本没有容易获得的不可变版本。因此,有时值得直接散列可变对象,并采取适当的预防措施以确保所讨论的对象永远不会被修改。 在开始为可变对象实现非常复杂的自定义哈希函数之前,我想检查一下用作哈希函数是否存在任何缺点- 无论是在性能,碰撞还是其他方面。 问题答案: 出于类似的原