【问题标题】:Jackson Json: how to convert array to JsonNode and ObjectNode?Jackson Json:如何将数组转换为 JsonNode 和 ObjectNode?
【发布时间】:2014-05-23 13:38:55
【问题描述】:

给定员工和公司类别

Company
{
    String companyName;
}

Employee
{
    String employeeName;
}

我的代码如下

List<Employee> e = new ArrayList<Employee>();
.....
.....

我希望我能得到这样的结果

{
    "company":{ 
                "companyName":"cName",
                "Employee":[
                    {"employeeName":"myName1"},
                    {"employeeName":"myName2"},
                    {"employeeName":"myName3"}
                ]
              }
}

这是一个简单的问题,但我很困惑...... 尤其是 Gson 和 Json....

请不要推荐其他库,我强制需要这个库才能工作。 并且由于某些情况,这个课程不是我想要的。

Company
{
    String companyName;
    List<Employee> employees;
}

因此我需要手动把它,并序列化为json字符串。

已编辑: @Sotirios Delimanolis 类声明是设计之间关系的正确方法 类。然而,这不是我想要的。

@hsluo 的回答是正确的!和@Sotirios Delimanolis 提到的一样。完全满足这个问题。

我确实找到了另一种使用 Hashmap 的方法

HashMap k = new HashMap();
List<employee> y = new ArrayList<employee>();
y......
k.put("records", y);
k.put("total", total);

然后返回@Responbody,结果和@hsluo回答的完全一样。

感谢@Sotirios Delimanolis、@hsluo 帮助我。

【问题讨论】:

    标签: java javascript json jackson


    【解决方案1】:

    您可以只创建一个包含 List&lt;Employee&gt; 的 POJO

    class Employees {
        @JsonProperty("Employee")
        private List<Employee> employees;
    
        public List<Employee> getEmployees() {
            return employees;
        }
    
        public void setEmployees(List<Employee> employees) {
            this.employees = employees;
        }
    }
    

    并将其序列化为ObjectNode

    Employees e = new Employees();
    List<Employee> employees = new ArrayList<Employee>();
    e.setEmployees(employees);
    ObjectNode objectNode = mapper.valueToTree(e);
    

    【讨论】:

    • 感谢您的帮助,但是这些课程不是我想要的,因为我想使用@ResponseBody 返回一个自定义的 JSON 字符串,公司和员工只是一个示例。所以在我的情况下,我想像这样{totalUser:20,user:[{...},{...}] 返回而不创建新类。
    • @Stupidfrog ObjectNode 类有许多 put 方法,您可以在其中向 JSON 对象添加字段。然后您可以在最终的ObjectNode 上调用toString() 并在@ResponseBody 注释方法中返回String
    【解决方案2】:
    ObjectMapper mapper = new ObjectMapper();
    List<Employee> e = new ArrayList<Employee>();
    ArrayNode array = mapper.valueToTree(e);
    ObjectNode companyNode = mapper.valueToTree(company);
    companyNode.putArray("Employee").addAll(array);
    JsonNode result = mapper.createObjectNode().set("company", companyNode);
    

    【讨论】:

    • 嗨,请问如何将 2 个 JsonNode 组合成 1 个对象。从上面的示例中,假设公司有另一个称为位置的属性。如何实现?
    • 我觉得你可以用put
    • 是的,经过测试,如果放入字符串或整数,则 JsonNode totalNode = mapper.createObjectNode().put("total", total).set("records", array);但是如何设置2个数组?我的意思是有另一个属性叫做 records2...
    • ObjectNode 添加另一个链接的set 调用应该没问题。小心那些api的返回值
    • 据我所知,当我调用set 时,它会以JsonNode 的形式返回,因此我只能调用set 1 次......
    【解决方案3】:

    你可以用jacksonObjectNodeputputArraylike

    import com.fasterxml.jackson.databind.node.ObjectNode;
    ArrayList<ObjectNode> employee = new ArrayList();
    for(int i = 1; i < 4; i++){
      ObjectNode em = Json.newObject();
      em.put("companyName", "cName" + i);
      employee.add(em);
    }
    ObjectNode company = Json.newObject();
    company.put("companyName", "cName");
    company.putArray("employee").addAll(employee);
    return Json.newObject().put("company", company);
    

    【讨论】:

      【解决方案4】:
      JsonNode result = new ObjectMapper().readTree(e.toString());
      

      【讨论】:

      • 亲爱的@daniel-alonso 虽然,这正确回答了标题中的问题,但它没有解决问题详细信息中描述的挑战 - 当然,您可以正确地争辩说标题不适合好吧 ;-) 但是,我仍然相信,我们应该始终努力了解我们真正被要求的帮助,所以我们可以给出答案,感谢您的关注
      • 也许,我只是误解了你的回答,那么也许你可以添加更多解释你的真正意思;-)
      【解决方案5】:
      List<String> yourList = new ArrayList<>();
      ((ObjectNode) someNode).set("listname", this.objectMapper.valueToTree(yourList));
      

      【讨论】:

      • 在你的答案中添加一些解释而不是仅仅给出代码 sn-ps 是一种很好的做法。很短或只是代码的答案会自动在此处标记为审核,即使它们是正确的。
      • 这个答案看起来很有希望,但是这背后的逻辑解释是必要的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      • 2016-12-06
      • 2020-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多