Saya memiliki masalah serupa, tetapi itu terkait dengan hubungan dua arah Hibernate. Saya ingin menunjukkan satu sisi hubungan dan secara terprogram mengabaikan yang lain, tergantung pada pandangan apa yang saya hadapi. Jika Anda tidak bisa melakukan itu, Anda akan berakhir dengan nasty StackOverflowException
s. Misalnya, jika saya memiliki benda-benda ini
public class A{
Long id;
String name;
List<B> children;
}
public class B{
Long id;
A parent;
}
Saya ingin mengabaikan secara terprogram parent
bidang di B jika saya melihat A, dan mengabaikan children
bidang di A jika saya melihat B.
Saya mulai menggunakan mixin untuk melakukan ini, tapi itu dengan sangat cepat menjadi mengerikan; Anda memiliki begitu banyak kelas tidak berguna yang hanya ada untuk memformat data. Saya akhirnya menulis serializer saya sendiri untuk menangani ini dengan cara yang lebih bersih: https://github.com/monitorjbl/json-view .
Ini memungkinkan Anda menentukan secara terprogram kolom apa yang akan diabaikan:
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(JsonView.class, new JsonViewSerializer());
mapper.registerModule(module);
List<A> list = getListOfA();
String json = mapper.writeValueAsString(JsonView.with(list)
.onClass(B.class, match()
.exclude("parent")));
Ini juga memungkinkan Anda dengan mudah menentukan tampilan yang sangat disederhanakan melalui pencocokan karakter pengganti:
String json = mapper.writeValueAsString(JsonView.with(list)
.onClass(A.class, match()
.exclude("*")
.include("id", "name")));
Dalam kasus awal saya, kebutuhan akan tampilan sederhana seperti ini adalah untuk menunjukkan minimal tentang orang tua / anak, tetapi juga menjadi berguna untuk keamanan berbasis peran kita. Tampilan objek yang kurang memiliki hak istimewa diperlukan untuk mengembalikan lebih sedikit informasi tentang objek.
Semua ini berasal dari serializer, tetapi saya menggunakan Spring MVC di aplikasi saya. Agar dapat menangani kasus ini dengan benar, saya menulis integrasi yang dapat Anda masukkan ke kelas pengontrol Spring yang ada:
@Controller
public class JsonController {
private JsonResult json = JsonResult.instance();
@Autowired
private TestObjectService service;
@RequestMapping(method = RequestMethod.GET, value = "/bean")
@ResponseBody
public List<TestObject> getTestObject() {
List<TestObject> list = service.list();
return json.use(JsonView.with(list)
.onClass(TestObject.class, Match.match()
.exclude("int1")
.include("ignoredDirect")))
.returnValue();
}
}
Keduanya tersedia di Maven Central. Saya harap ini membantu orang lain di luar sana, ini adalah masalah yang sangat buruk dengan Jackson yang tidak memiliki solusi yang baik untuk kasus saya.