当前位置: 首页 > 知识库问答 >
问题:

如何在java中建模分层json

凌声
2023-03-14

我是一个前端开发人员,对后端开发是全新的。我的任务是在Java对象中建模json。现在我的控制器返回的只是一些模拟数据。

{
   "data":{
      "objectId":25,
      "columnName":[
         "myCategory",
         "myCategoryId"
      ],
      "columnValues":[
         [
            "Category One",
            1
         ],
         [
            "Category Two",
            2
         ],
         [
            "Category Three",
            3
         ],
         [
            "Category Four",
            4
         ],
         [
            "Category Five",
            5
         ]
      ]
   }
}

这是我的尝试。控制器正确地返回了这个json。但这是不是太简单了?我认为应该做的是将列名称和列值数组外推到单独的类中,但我不确定如何进行。

package com.category;

import java.util.List;

public class MyObjectData {
    private int objectId;
    private List columnName;
    private List columnValues;

    public int getObjectId() {
        return objectId;
    }
    public void setObjectId(int objectId) {
        this.objectId = objectId;
    }

    public List getColumnName() {
        return columnName;
    }

    public void setColumnName(List colName) {
        this.columnName = colName;
    }

    public List getColumnValues() {
        return columnValues;
    }

    public void setValues(List values) {
        this.columnValues = values;
    }

}

关于columnNames和ColumnValue,我觉得应该在模型中执行类似的操作:

private List<ColumnNames> columnNames;
    private List<ColumnValues> columnValues;

    public List<ColumnNames> getColumnNames() {
        return columnNames;
    }

    public void setColumnNames(List<ColumnNames> columnNames) {
        this.columnNames = columnNames;
    }

    public List<ColumnValues> getColumnValues() {
        return columnValues;
    }

    public void setColumnValues(List<ColumnValues> columnValues) {
        this.columnValues = columnValues;
    }

然后我会给他们上两门课,就像这样:

package com.category;

import java.util.List;

public class ColumnName {

    private String columnName;

    public String getColumnName() {
        return columnName;
    }

    public void setColumnName(String columnName) {
        this.columnName = columnName;
    }

}

package com.category;

import java.util.List;

public class ColumnValue {

    private String columnValue;
    private int columnValueId;

    public String getColumnValue() {
        return columnValue;
    }

    public void setColumnValue(String columnValue) {
        this.columnValue = columnValue;
    }

    public String getColumnValueId() {
        return columnValueId;
    }

    public void setColumnValueId(int columnValueId) {
        this.columnValueId = columnValueId;
    }

}

我觉得我的作品都很好,但我不确定这是否比我最初的尝试更好。。。这很有效。只是在寻找输入。提前谢谢。

共有1个答案

呼延才
2023-03-14

在您的结构中,columnValues实际上是表中有两列的行:myCategory和myCategoryId。

更“面向对象”的Java类可以是这样的:

public class MyObjectData {

    private int objectId;

    private List<MyObjectRow> columnValues; // I would have named this as rows

}

public class MyObjectRow {

    private String myCategory;

    private String myCategoryId;

}

现在您需要一个自定义序列化程序将其转换为您期望的JSON结构:

public class MyObjectDataSerializer extends StdSerializer<MyObjectData> {

    public MyObjectDataSerializer() {
        super(MyObjectData.class);
    }

    public void serialize(MyObjectData value, JsonGenerator generator, SerializerProvider provider) throws IOException {
        generator.writeStartObject();
        generator.writeNumberField("objectId", value.getObjectId());

        generator.writeArrayFieldStart("columnName");
        generator.writeString("myCategory");
        generator.writeString("myCategoryId");
        generator.writeEndArray();

        generator.writeArrayFieldStart("columnValues");
        for (MyObjectRow row : value.getColumnValues()) {
            generator.writeStartArray();
            generator.writeString(row.getMyCategory());
            generator.writeNumber(row.getMyCategoryId());
            generator.writeEndArray();
        }
        generator.writeEndArray();


        generator.writeEndObject();
    }
}

注意:您可以使用反射来动态提取字段名和值。

然后可以将MyObjectData对象序列化为所需的形式:

public class MyObjectDataSerializerTest {

    @Test
    public void shouldCustomSerializeMyObjectData() throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        SimpleModule module = new SimpleModule();
        module.addSerializer(MyObjectData.class, new MyObjectDataSerializer());
        mapper.registerModule(module);

        MyObjectData myObjectData = new MyObjectData();
        myObjectData.setObjectId(25);
        myObjectData.setColumnValues(Arrays.asList(
                new MyObjectRow("Category One", 1),
                new MyObjectRow("Category Two", 2),
                new MyObjectRow("Category Three", 3)
        ));


        String serialized = mapper.writeValueAsString(myObjectData);

        assertThat(serialized, equalTo("{\"objectId\":25,\"columnName\":[\"myCategory\",\"myCategoryId\"],\"columnValues\":[[\"Category One\",1],[\"Category Two\",2],[\"Category Three\",3]]}\n"));
    }

}

 类似资料:
  • 我有一个火花数据框,我需要写入MongoDB。我想知道如何在mongoDB中将数据框的一些列写成嵌套/分层JSON。假设数据框有6列,col1,col2,…… col5,col6我想要col1,col2,col3作为第一层次结构,其余列col4到col6作为第二层次结构。像这样的东西, 我如何在pyspark中实现这一点?

  • 我感兴趣的是用Java创建一个分层tif,使Photoshop能够识别层。我能够创建多页tif,但Photoshop无法将这些页面识别为层。不过,Acrobat可以查看这些页面。谁知道Photoshop是如何存储tif层数据的,以及如何用Java生成这些数据? 谢谢

  • 本文向大家介绍MongoDB 中创建分层JSON,包括了MongoDB 中创建分层JSON的使用技巧和注意事项,需要的朋友参考一下 使用以下语法在MongoDB中创建分层JSON- 让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出-

  • 问题内容: 我对用Java创建分层的tif感兴趣,以使Photoshop能够识别这些层。我能够创建多页tif,但是Photoshop无法将页面识别为图层。尽管可以使用Acrobat查看页面。有人知道Photoshop如何存储tif图层数据以及如何用Java生成吗? 谢谢。 问题答案: 我已经为TIFF ImageIO插件进行了研究,据我了解,Photoshop在TIFF中存储图层信息的方式是完全专

  • 问题内容: 我有一个MySQL表,如下所示: 现在,我想有一个简单的MySQL查询,只需向其提供ID [例如说id=19],然后就应该获取其所有子ID [即结果应具有ID ‘20,21,22’]…。 孩子的等级未知;它可能会有所不同.... 我知道如何使用for循环…但是如何使用单个MySQL查询实现相同的目标? 问题答案: 对于MySQL 8+:使用递归with语法。 对于MySQL 5.x:使

  • 我有一个MySQL表,如下所示: 现在,我想有一个MySQL查询,我只需向它提供id(例如),然后我应该获得它的所有子id(即,结果应该有id'20、21、22']... 不知道孩子的等级;它可以变化.... 我知道如何使用循环来实现...但是如何使用单个MySQL查询实现相同的功能呢?