【问题标题】:Java structure for Datatables editor json数据表编辑器 json 的 Java 结构
【发布时间】:2016-06-02 14:27:38
【问题描述】:

对于数据表编辑器传递给我的一些 JSON 数据,我需要一个 Java 数据结构。接收到的数据格式是这样的:

{
    "action":"edit",
    "data": {
        "1009558":{
            "weekNumber":"2"
            ... (more properties)
         }
     }
}

这是完整的文档:https://editor.datatables.net/manual/server

编辑:文档显示作为表单参数发送的数据。我正在对数据进行字符串化并将其作为 JSON 发送。上面有一个例子。

“1009558”是行 ID。如果编辑器发送了多行,则将有多个数组条目(每个条目都有一个 ID)。

谁能提供一些关于如何为反序列化(通过 Spring MVC)制作​​ Java 数据结构的建议?我可以很容易地映射“动作”,但我被困在“数据”元素上。

【问题讨论】:

  • 查看 Jackson 并创建自定义反序列化器。
  • 您能否提供您尝试映射的完整 JSON 对象(至少一个条目)?
  • 你能仔细检查一下示例 JSON 吗?它看起来不像您链接的网站上提供的示例。
  • @JHarnach 好点...在网站上,示例显示了作为表单参数发送的数据:action = create data[0][extn] = 2947 data[0][first_name] = 。 ...虽然我将它作为 JSON 发送。有关它的外观示例,请参阅我的帖子
  • 我对我的原始帖子添加了一个编辑,希望能增加一些清晰度

标签: java json datatable jackson


【解决方案1】:

我宁愿建议你使用jackson

这是您要求的示例:

package com.github.xsavikx.jackson;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.HashMap;
import java.util.Map;

public class JacksonTest {
    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        Map<String, DatabaseRow> data = new HashMap<>();
        DatabaseRow row = new DatabaseRow(2, "someData");
        data.put("1009558", row);
        String action = "action";
        DatabaseEntry dbEntry = new DatabaseEntry();
        dbEntry.setAction(action);
        dbEntry.setData(data);
        System.out.println(objectMapper.writeValueAsString(dbEntry));
    }
}

结果:

{"action":"action","data":{"1009558":{"weekNumber":2,"someData":"someData"}}}

型号:

package com.github.xsavikx.jackson;

import java.util.Map;

public class DatabaseEntry {
    private String action;
    private Map<String, DatabaseRow> data;

    public DatabaseEntry() {

    }

    public DatabaseEntry(String action, Map<String, DatabaseRow> data) {
        this.action = action;
        this.data = data;
    }

    public Map<String, DatabaseRow> getData() {

        return data;
    }

    public void setData(Map<String, DatabaseRow> data) {
        this.data = data;
    }

    public String getAction() {
        return action;
    }

    public void setAction(String action) {
        this.action = action;
    }
}

package com.github.xsavikx.jackson;

public class DatabaseRow {
    private int weekNumber;
    private String someData;
    public DatabaseRow(){
    }
    public DatabaseRow(int weekNumber, String someData) {
        this.weekNumber = weekNumber;
        this.someData = someData;
    }

    public int getWeekNumber() {
        return weekNumber;
    }

    public void setWeekNumber(int weekNumber) {
        this.weekNumber = weekNumber;
    }

    public String getSomeData() {
        return someData;
    }

    public void setSomeData(String someData) {
        this.someData = someData;
    }
}

更新: 更通用的地图解决方案:

package com.github.xsavikx.jackson;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class JacksonTest {
    public static void main(String[] args) throws IOException {
        serializeTest();
        deserializeTest();
    }
    private static void deserializeTest() throws IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        DatabaseEntry databaseEntry = objectMapper.readValue("{\"action\":\"action\",\"data\":{\"1009558\":{\"weekNumber\":2,\"someData\":\"someData\"}}}", DatabaseEntry.class);
        System.out.println(databaseEntry);
    }

    private static void serializeTest() throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        Map<String,Map<String,String>> data = new HashMap<>();
        Map<String,String> values = new HashMap<>();
        values.put("weekDay","2");
        values.put("unpredictableValue","value");
        data.put("1009558", values);
        String action = "action";
        DatabaseEntry dbEntry = new DatabaseEntry();
        dbEntry.setAction(action);
        dbEntry.setData(data);
        System.out.println(objectMapper.writeValueAsString(dbEntry));
    }
}

型号: 包 com.github.xsavikx.jackson;

import java.util.Map;

public class DatabaseEntry {
    private String action;
    private Map<String, Map<String,String>> data;

    public DatabaseEntry() {

    }

    public String getAction() {
        return action;
    }

    public void setAction(String action) {
        this.action = action;
    }

    public Map<String, Map<String, String>> getData() {
        return data;
    }

    public void setData(Map<String, Map<String, String>> data) {
        this.data = data;
    }
}

【讨论】:

  • 我想让 DatabaseRow 类更通用一点,这样我就可以将它重用于编辑器的其他实例。即,而不是 weekNumber 和 someData,名称/值对的映射如何?
  • @BrianKates,现在取决于您,如何根据自己的要求进行更改。我只是建议你使用jackson(因为它很容易与Spring MVC集成)并提出了一些例子。您可以使用 Map> 或任何您想要的数据字段。
  • 谢谢,我喜欢 Map> 的想法,但我需要考虑一下 :)
  • @BrianKates,我已经用地图更新了我的答案。
【解决方案2】:

我是 Joe Littlejohn 的JSON tool 的忠实粉丝。为它提供一个示例 JSON 文件,它可以为您生成 POJO。

这是它生成的示例,基于您发布的网站上的 JSON 片段。

JSON:

{
"data": [
    {
        "DT_RowId":   "row_29",
        "first_name": "Fiona",
        "last_name":  "Green",
        "position":   "Chief Operating Officer (COO)",
        "office":     "San Francisco",
        "extn":       "2947",
        "salary":     "850000",
        "start_date": "2010-03-11"
    }
]

}

JAVA:

@Generated("org.jsonschema2pojo")
public class Datum {

    public String dTRowId;
    public String firstName;
    public String lastName;
    public String position;
    public String office;
    public String extn;
    public String salary;
    public String startDate;
}

@Generated("org.jsonschema2pojo")
public class Example {
    public List<Datum> data = new ArrayList<Datum>();
}

更新:

看起来 this 是表单提交实际发送的内容:

action:edit
data[row_1][first_name]:Tiger23
data[row_1][last_name]:Nixon
data[row_1][position]:System Architect
data[row_1][office]:Edinburgh
data[row_1][extn]:5421
data[row_1][start_date]:2011-04-25
data[row_1][salary]:320800

我不认为这是 Json,我不知道我是否会尝试这样对待它。如果您需要使用 Java 提交表单数据,您最好使用Apache HttpComponents。您可以将上面的 Java“数据”对象作为域对象重用,然后使用以下格式的字符串填充 POST 内容:

data[ \DT_RowId\ ][\PropertyName\]: \PropertyValue\

【讨论】:

  • data 属性似乎是 Map 而不是 List
  • @Edd 我认为这是他的示例中的错字,链接网站上的示例显示“数据”是一个数组。
  • @JHarnach 它使用示例数据生成了不太好的 Java 结构:{ "action":"edit", "data": { "1009558":{ "weekNumber":"2" }, " 1009557":{ "weekNumber":"2" } } }
  • @BrianKates Gotcha,我以为您正在尝试解析响应,我会更新我的答案。
【解决方案3】:

使用 Spring Boot,服务器和客户端之间的 json 转换是自动的 (https://stackoverflow.com/a/44842806/3793165)。

这种方式对我有用:

控制器

@PostMapping(value="/nuevoVideo")
    @ResponseBody
    public RespuestaCreateVideo crearNuevoVideo(@RequestBody PeticionVideos datos) {
       RespuestaCreateVideo respuesta = new RespuestaCreateVideo();
       respuesta.setData("datos");
       //respuesta.setError("error"); // implement the logic for error and return the message to show to the user.
      return respuesta;
    }

PeticionVideos (RequestVideos) 是 Datatables 编辑器发送的创建结构(带有 setter、getter...):

public class PeticionVideos {
    private Map<String, Video> data;
    private String action;
}

服务器对正在等待的客户端数据表的响应具有特定格式(请查看https://editor.datatables.net/manual/server)。

我经常用这个:

public class RespuestaCreateVideo { //ResponseCreateVideo
    private String data;
    private String error;
}

经过两天的尝试,现在效果很好!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    相关资源
    最近更新 更多