假设我有以下对象:
public class ComplexJacksonObject extends BaseJsonObject {
public int Start;
public int Count;
public Person MyPerson;
public class Person extends BaseJsonObject {
public String Firstname;
public String Lastname;
public Address Where;
}
public class Address extends BaseJsonObject {
public String Street;
public int Number;
}
}
很明显,当我向 Jackson 请求此 JSON 时,我得到如下内容:
public String toJson(ComplexJacksonObject obj) {
try {
return generateMapper().writeValueAsString(obj);
} catch (JsonProcessingException e) {
e.printStackTrace();
return null;
}
}
// returned: {"MyPerson":{"Firstname":"First","Lastname":"Last","Where":{"Street":"Street","Number":15}},"Count":1,"Start":2}
然而,我对 QueryString 的需求是将顶级属性对转换为 Key=Value& 格式,因此类似于:
MyPerson={"Firstname":"First","Lastname":"Last","Where":{"Street":"Street","Number":15}}&Count=1&Start=2
当然还有 MyPerson=[This_Part_Needs_To_Be_Url_Encoded]。
Jackson 中是否有任何通用方法可以自动为我执行此操作?或者我会被迫提出自己的想法吗?一些字符串替换正则表达式?有任何想法吗?
最佳答案
[编辑] 注意:我误解了这个问题。我在下面的回答回答了如何解析 JSON 并获取 Java 对象。您想要获取键值对,其中 JSON 是对象的值。以下答案不会回答该问题。抱歉造成混淆。
您可以通过对 Java 模型使用 Jackson 注释并向 JSON 对象添加“类型”来解决此问题。您可能想出于您的目的对其进行研究,但这是我过去完成的一些代码的示例。
public class Requirement {
private String title;
private String reqId;
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="type")
@JsonSubTypes({
@JsonSubTypes.Type(value=CountRequirementList.class, name="COUNT"),
@JsonSubTypes.Type(value=AndRequirementList.class, name="AND"),
@JsonSubTypes.Type(value=OrRequirementList.class, name="OR")
})
private List<RequirementList> fulfillments;
其中 baseObject
是 RequirementList
,类名是 requirements
列表的类型。
为了使从 JSON 来回更容易,有时只向对象添加一个类型会很方便。如果有帮助,我在下面包含了更多代码。 (注意:我没有包含 Jackson 所需的所有 getter 和 setter)
public abstract class RequirementList {
private LogicType type;
private String id;
private String title;
private String description;
protected float requiredCount; //For count type subclass. Designed to be count of credits
private List<Object> fulfillments;
}
public class OrRequirementList extends RequirementList {
public OrRequirementList() {
super();
super.setType(LogicType.OR);
}
}
关于java - 如何使用 Jackson 将复杂的 Json 对象序列化为 HTTP Get 的 QueryString?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21492529/