2014-10-15 2 views
1

Я пытаюсь преобразовать этот класс ниже, используя метод Gson.ToJson(Object), но returing мне объект хэш-код класса, например: [email protected]Gson.toJson (Object) возвращает объект хэш-код

Однако я может получить user.expertise без каких-либо проблем, и со всеми отношениями: Gson.ToJson(user.getExpertise)

@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(user) на самом деле возвращает строку JSON, так что я могу использовать Gson.FromJson на моем другом конце? Спасибо заранее.

+0

Почему у вас есть адаптеры типа? Почему вы записываете вывод 'toString' в' JsonWriter'? –

+0

@SotiriosDelimanolis Без адаптеров типа Gson дает мне StackOverFlow. Выходной файл gson.ToJson (пользователь) является возвратом метода Restfull. – VyMajoris

+0

Объекты 'Review' имеют обратные ссылки на их' Пользователь'? –

ответ

2

Я думаю, что вам нужно использовать метод enableComplexMapKeySerialization(). Here вы можете увидеть следующую документацию:

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(); 
+0

Извините, результатов нет. Я также не реализовал интерфейс _Serializable_ в моем классе User. Может быть, это проблема? – VyMajoris

+0

Попробуйте добавить интерфейс _Serializable_, какие проблемы? Если это будет работа, не забудьте добавить в свой класс User _private static final long serialVersionID_. – 0xFF

+0

Да ... Извините за задержку, но все равно. На данный момент я просто разлагаю свойства объекта User, а затем создаю еще один Json шаг за шагом или что-то в этом роде. – VyMajoris

Смежные вопросы