2013-03-22 58 views
0

我有一个用例,我们必须向不同的服务器发送不同的JSON。如何在Java代码中动态生成和检索JSON?

区别仅在于JSON键之间,键所携带的含义是相同的,数据也是如此。

例如服务器XYZ想要JSON数据,在此格式发送:

{ "firstName":"Sam", "lastName":"Jones"} 

现在服务器ABC希望以这种格式发送JSON数据:

{ "fName":"Sam", "lName":"Jones"} 

和名字和lastName数据通过POJO填充。

那么,我该如何做到这一点?我不想用if-else条件来混淆代码。

但是我们有一些工作就像一个模板动态加载并创建JSON数据并将其恢复到POJO。

+0

使用JSON库,如GSON或Jackson(或其他)。如果你不想使用任何这些奇特的库,你可以使用[这个](http://json.org/java/) – 2013-03-22 05:34:05

+0

来操作你自己的JSON模板,如果Keys的顺序是相同的,那么你可以去与指数。就像'1st'将始终是'FirstName'和'2nd'将始终是'LastName'等等 – 2013-03-22 05:36:16

+0

@MuhammadHaseebKhan键的顺序可能不同。 – Sam 2013-03-22 05:37:46

回答

0

您应该创建两个POJO。每个服务器一个。每个POJO可以具有不同的属性名称以满足每个服务器的要求。

或者POJO可以具有相同的属性名称,但需要注释以生成不同的JSON属性。像杰克逊这样的JSON库可以使用JsonProperty注释来执行此操作。

+0

是否可以动态创建这些POJO?因此,根据服务器的不同,POJO可以传递给Jackson库来创建JSON?为什么我问的是因为将来我会将此POJO作为模板存储在数据库中,并将其用于生成JSON。通过这种方式,我只需在DB中添加条目,然后为新的服务器准备好新的JSOn,以便与我们进行通信。 – Sam 2013-03-22 05:47:14

+0

从定义创建存根是Web服务试图用wsdl文件实现的。真实的生活经历是非常痛苦的;任何小的改变,你必须重新生成所有的存根,解析器的行为不同,等等。就JSON蚂蚁的规范达成一致意见要容易得多,让每个服务器的实现者都以它的方式生成它。如果您控制服务器,只需生成一个带有存根的jar,并使其可用。 – 2013-03-22 05:55:05

+1

@Sam你可能想看看这个。 http://stackoverflow.com/questions/12134231/jackson-dynamic-property-names – 2013-03-22 06:00:18

0

这个策略如何?

1.定义要用作公共接口..

interface People{ 
    public String getRegularFirstName(); 
    public String getRegularLastName(); 
} 

2.定义与实现接口的每个POJO

//类 “{ ”名字“:” 萨姆”, “姓氏”: “琼斯”} “

class PeopleData2 implements People{ 
    private String firstName; 
    private String lastName; 

    public String getRegularFirstName(){ 
     return firstName; 
    } 
    public String getRegularLastName(){ 
     return lastName; 
    } 
    //getter setter here.. 
} 

//类 ”{ “FNAME”:“ 山姆”, “L-NAME”: “琼斯”}”

class PeopleData1 implements People{ 
    private String fName; 
    private String lName; 

    public String getRegularFirstName(){ 
     return fName; 
    } 
    public String getRegularLastName(){ 
     return lName; 
    } 
    //getter setter here.. 
} 

3.使每个JSON格式当之无愧每个POJO类..

这不是dinamically策略,因为它需要添加类磨片新的形式出现。 但它会帮助系统扩展性

+0

PeopleData1类必须遵循JavaBean命名约定。我的意思是getter getRegularFirstName应该是getfName。否则JSOn不会被JSOn库正确生成。 – Sam 2013-03-22 08:03:14