java中的JSON动态反序列化
我从服务器得到的Json休息如下所示java中的JSON动态反序列化,java,json,Java,Json,我从服务器得到的Json休息如下所示 { "duration": 0, "taskSummaries": [ { "name": null, "id": 151, "priority": 0, "content": "{\"Comment\":\"Employee:{name}\",\"TaskName\":\"employeeForm\",\"GroupId\":\"
{
"duration": 0,
"taskSummaries": [
{
"name": null,
"id": 151,
"priority": 0,
"content": "{\"Comment\":\"Employee:{name}\",\"TaskName\":\"employeeForm\",\"GroupId\":\"HR\",\"NodeName\":\"Employee Form\"}",
"processId": "demoProject1.busiProce1",
"description": null,
"subject": null,
"statusMessage": "Ready",
"itemID": "com.demo.tp15:demoProject1:1.0",
"potentialOwners": [
{
"name": "mary",
"type": "USER"
}
],
"skippable": true,
"actualOwner": null,
"createdBy": null,
"createdOn": null,
"activationTime": 1412582092211,
"processInstanceId": 172,
"processSessionId": 0,
"quickTaskSummary": null,
"parentId": null
}
],
"statusMessage": "200",
"itemID": null,
"processInstanceId": 172,
"startURL": null,
"processAppID": "demoProject1.busiProce1",
"processAppName": null,
"processState": {
"description": "Active",
"code": 1
},
"dueDate": null,
"startDt": null,
"endDt": null,
"parentProcessInstanceId": 0,
"outcome": null,
"identity": null,
"processVersion": null,
"processName": null,
"externalId": null
}
而且我也无法控制我的pojo/模型对象…根据我的编码标准,我必须遵循命名约定,例如任务摘要将是tskSumris,名称是nme,员工是Employee
我的问题是:
当Json字符串和pojo中的名称不匹配时,我想动态地将Json字符串分配给pojo/模型
我知道(事实上我也做过)如果我有匹配的名字,那么我可以这样做
private Object getDynamicObject(String jsonString,Class class1) throws JsonParseException, JsonMappingException, IOException{
ObjectMapper mapper = new ObjectMapper();
Object dynamicObject = null;
dynamicObject = mapper.readValue(jsonString, class1);
return dynamicObject;
}
你们能帮帮我吗。试试Jackson-->它有很多库,可以帮助你们动态(反)序列化JSON和Java POJO。它主要是使用注释完成的。
如果您不想这样做,您可以自己编写一些基于反射的代码。找到名称和类型与JSON匹配的类变量,类似地,反过来创建JSON
好的,我刚刚注意到你提到你不能控制pojo变量名。因此,我建议使用Jackson,在pojo中为字段添加注释。就像我说的,如果Jackson不是你的选择,你可以创建你自己的注释和实用程序代码来做同样的事情
编辑1:
这里是Jackson的代码示例,请注意,字段名和Json属性名不需要相同
import java.io.StringWriter;
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.ObjectMapper;
public class Test
{
@JsonProperty(value="employeeName")
private String empName;
@JsonProperty(value="employeeAge")
private int age;
public static void main(String[] args) throws Exception
{
Test t = new Test();
t.empName = "arun";
t.age = 100;
ObjectMapper m = new ObjectMapper();
StringWriter w = new StringWriter();
m.writeValue(w, t);
w.close();
String json = w.getBuffer().toString();
System.out.println(json);
Test t1 = m.readValue(json, Test.class);
System.out.println(t1.empName);
System.out.println(t1.age);
}
}
控制台输出如下所示:
{"employeeName":"arun","employeeAge":100}
arun
100
您是否直接从Pojo模型类生成Json?我所做的是获取数据,然后使用bean映射器将其映射到新的Pojo。新映射器中的每个元素都将有一个XMLElement标记来转换为相应的Json/XML。然后我们使用Jackson来转换它,并将其作为输出提供。因此,最后我有两个pojo,一个用于Hibernate,另一个用于映射到Json。关于您的信息,我的示例pojo可能如下所示:@XmlAccessorType(XmlAccessType.FIELD)@XmlType(name=“ProcessKey”,propOrder={“prcsNme”,“dplyName”})公共类ProcessKey{@XmlElement(name=“prcsNme”,required=true)受保护字符串prcsNme;@xmlement(name=“DplyNme”,required=true)受保护字符串DplyNme;公共字符串getPrcsNme(){return prcsNme;}公共void setPrcsNme(字符串值){this.prcsNme=value;}公共字符串getDplyNme(){return DplyNme;}公共void setDplyNme(字符串值){this.dplyName=value;}}不,Akhil,我们通过调用服务器得到第三方的响应。分配变量很痛苦,所以我正在寻找动态解决方案。用一个示例编辑答案。你甚至可以下一个其他类型,即,如果你创建了一个Address类,并将其作为上述类中的一个字段,只要你正确地注释并保持默认的constructors一切正常。谢谢Arun。你的解决方案似乎对我有效。让我检查一下我是否可以修改我的模型。我只是碰巧正在处理一些需要相同的东西,所以幸运的连接!很高兴它能工作!它按照我想要的方式工作。但问题是我无法修改我的Pojo/模型。我正在与soluti的技术小组讨论在…上