【问题标题】:How to model hierarchical json in java如何在java中建模分层json
【发布时间】:2019-06-21 23:58:07
【问题描述】:

我是一名前端开发人员,对后端开发不熟悉。我的任务是在 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。但这不是太简单了吗?我认为应该做的是将 columnNamecolumnValues 数组外推到单独的类中,但我不确定如何。

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;
    }

}

关于 columnNamescolumnValues,我觉得我应该在模型中做这样的事情:

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;
    }

}

我觉得我拥有所有正确的部分,但只是不确定这是否比我最初的尝试更好......这很有效。只是寻找输入。提前致谢。

【问题讨论】:

  • 您是否使用第三方库来解析 JSON?我建议使用 Jackson 和 ObjectWriter
  • 也许这个问题更适合Code Review site
  • @jclassic - 我们使用杰克逊。
  • 看来 columnName 可以只是 List&lt;String&gt; 。至于嵌套列表,看看这个答案here
  • 附注,因为您是 Java 新手,数据结构(例如 List可以是通用的,但它们应该是类型化的(它们是 @默认为Object 类型的987654330@)。

标签: java json


【解决方案1】:

在您的结构中,columnValues 实际上是表中包含两列的行:myCategorymyCategoryId

一个更“面向对象”的 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"));
    }

}

【讨论】:

    猜你喜欢
    • 2021-04-27
    • 2020-08-03
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    相关资源
    最近更新 更多