我正在尝试将业务对象序列化为JSON以供Javascript应用程序使用。问题是我试图保持我的业务对象“纯粹”,因为他们不知道数据访问或持久性。在我看来,使用toJSON()函数“稀释”我的对象将违背这一目标。另一方面,使用外部对象来序列化我的业务对象是行不通的,因为我将所有实例变量保密。
我接近这种方式完全是错误的吗?
答案 0 :(得分:6)
如果实例变量是私有的,则它们不应出现在发送到JavaScript应用程序的序列化中。根据定义,如果您将它们序列化并将它们发送到单独的应用程序,则它们是公开的。因此,外部对象应该有一些方法可以访问它们,可能是通过某种getter方法。
答案 1 :(得分:1)
将JSON中的数据分类的目的是什么?它纯粹是为了报道吗?如果是这样,那么Brian是正确的,那些变量应该有getter方法。
如果序列化的目的是将数据传输到可以操作它然后返回到原始应用程序的JavaScript应用程序,那么也许最好通过创建一个用于序列化目的的相关类来保持最佳状态保持强大的封装。
例如,在Java中,您可以定义内部类。内部类实例可以直接访问封闭类实例的所有字段,而无需getter方法。或者,您可以使用正确的访问修饰符对包(或命名空间)进行分组,以允许序列化程序访问,但不允许任何其他类访问。
或者你可以使用反射。或者劫持toString方法。 (或者照亮它并创建一个toJson方法。)
答案 2 :(得分:0)
您是否考虑从非JavaScript代码(如服务器端Java)生成JSON?答案类型取决于:JSON的处理在Javascript和Java上是完全不同的。已经有一个javascript-side的答案,这似乎是正确的。
如果是在Java上,有些库可以提供帮助;例如(Jackson)可以使用常规的getX / setX方法内省反序列化任何bean;加上附加(和可选)注释。