java - 如何使用 Jackson 将复杂的 Json 对象序列化为 HTTP Get 的 QueryString?

标签 java android regex json jackson

假设我有以下对象:

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;

其中 baseObjectRequirementList,类名是 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/

相关文章:

java - 当子实体被删除时,Hibernate 确实执行更新而不是删除操作

java - Android使用target时的Picasso回调

android - 为了将应用程序从一个 Google Play 开发者帐户转移到另一个帐户,我需要应用程序 key 吗?

regex - 在 Bash 中使用逗号分隔的字符串作为变量的输入

java - 如何从数据库中获取用户名和密码并传递给 Spring MVC 中的方法

java - 在 Mac 计算机上更新 Java 版本的最佳方法是什么?

java - 无法从 src\test 文件夹中找到 "Run File"-> 找不到或无法加载主类

android - 单击按钮时在 map 上平移坐标 (Android)

regex - Apache Rewrite 子域上的图像

python - 如何在 Python 中使用正则表达式从 url 中提取特定模式?