获取JSON映射时出错<;字符串,对象>;使用SpringMVC和Jackson2

获取JSON映射时出错<;字符串,对象>;使用SpringMVC和Jackson2,json,spring,spring-mvc,jakarta-ee,jackson,Json,Spring,Spring Mvc,Jakarta Ee,Jackson,我试图得到一张地图,其中有一个带有动作数量的'number',还有一个带有动作列表的'actions'。 我检查了java中的操作列表,它运行得很好 我有4个动作,在json文件中,我只做了第一个动作 java中的控制器 @RequestMapping(value = "/getactions/{idTask}", method = RequestMethod.GET, produces = "application/json") @ResponseBody public Map<Stri

我试图得到一张地图,其中有一个带有动作数量的'number',还有一个带有动作列表的'actions'。 我检查了java中的操作列表,它运行得很好

我有4个动作,在json文件中,我只做了第一个动作

java中的控制器

@RequestMapping(value = "/getactions/{idTask}", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
public Map<String, Object> getActions(Principal principal,
        @PathVariable Long idTask) {
    logger.info("Task controller get actions...");

    List<TaskAction> actions = null;

    if (principal == null) {
        actions = new ArrayList<TaskAction>();
    } else {
        actions = taskActionService.getAllTaskActions(idTask);
    }

    System.out.println(">>>>>>>>Task Controller - Actions>>>>>>>>>>>>> "
            + actions.size());
    for (TaskAction ta : actions) {
        System.out.println(">>>>>>>>ta: " + ta.getActionname());
    }
    System.out.println(">>>>>>>>END getAllActions()>>>>>>>>>>>>> ");

    Map<String, Object> data = new HashMap<String, Object>();
    data.put("actions", actions);
    data.put("number", actions.size());

    return data;
}
我没有得到任何错误,但json结果只获取操作列表中的第一个元素和其余操作的id

我从http获取的json…getactions/8

{  
   "number":4,
   "actions":[  
      { ... },
      3,
      4,
      5
   ]
}
这个。。。是第一个恢复良好的动作。(为了清晰起见,我避免编写代码)

你知道会是什么吗

提前谢谢


带有两个操作的json示例

{
    "number": 2,
    "actions": [{
        "idTaskAction": 4,
        "task": {
            "idTask": 8,
            "taskname": "abbbbbbbbbbbbbb",
            "description": "fffffffffffffffqqqqq",
            "date": 1389569940000,
            "deadline": -23918633280000,
            "category": {
                "idTaskCategory": 1,
                "sortOrder": 0,
                "categoryname": "cat1",
                "timestamp": 1402437394000
            },
            "priority": {
                "idTaskPriority": 1,
                "sortOrder": 0,
                "aka": "none",
                "priorityname": "low",
                "timestamp": 1402437527000
            },
            "state": {
                "idTaskState": 1,
                "statename": "pending"
            },
            "user": {
                "idUser": 1,
                "username": "joe"
            },
            "userResponsible": {
                "idUser": 1,
                "username": "joe"
            },
            "evaluation": "12345678saad",
            "pending": 0,
            "actions": [{
                "idTaskAction": 2,
                "task": 8,
                "date": 1402652358000,
                "actionname": "tacometer",
                "description": "asfdafa",
                "duration": 12,
                "user": {
                    "idUser": 1,
                    "username": "joe"
                },
                "timestamp": 1411493866000
            },
            {
                "idTaskAction": 3,
                "task": 8,
                "date": 1404207558000,
                "actionname": "hola",
                "description": "un dos tres",
                "duration": 20,
                "user": {
                    "idUser": 1,
                    "username": "joe"
                },
                "timestamp": 1405022827000
            },
            4,
            {
                "idTaskAction": 5,
                "task": 8,
                "date": 1412164741000,
                "actionname": "other action",
                "description": "ya me my",
                "duration": 22,
                "user": {
                    "idUser": 1,
                    "username": "joe"
                },
                "timestamp": 1411733131000
            }],
            "timestamp": 1411733131000
        },
        "date": 1412074440000,
        "actionname": "hi there",
        "description": "lkjñlkj ya",
        "duration": 25,
        "user": {
            "idUser": 1,
            "username": "joe"
        },
        "timestamp": 1411733090000
    },
    5]
}

问题是类任务、用户。。。具有带有ObjectedGenerator.PropertyGenerator.class选项的@JsonIdentityInfo,因此当Jackson尝试将对象序列化为json时,如果对象已在文件中,则不会再次添加该对象。这样可以避免使用无限递归序列化json文件

为了解决这个问题,我们需要更改ObjectedGenerator.None.class的ObjectedGenerator.PropertyGenerator.class,这样即使对象已经是其他对象的一部分,也可以序列化这些对象

改变

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "@id")
为了


你能采取行动吗?如果是,java的输出是什么?您如何使用action object创建file.json?@Benjamin Spring在javaee上工作。没有javaee,Spring就无法工作。你在哪里被误导了?@Ashish是的,我在java中获取操作,通过url…/getactions/x获取json文件。Jackson创造了魔法,将地图翻译成json。现在我发布了我得到的java sysout。所以我假设将java对象转换为JSON对象的逻辑在getAllTaskActions中?该函数是List getAllTaskActions(long idTask)和return List。这里有一个简单的杰克逊的例子
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "@id")
@JsonIdentityInfo(generator = ObjectIdGenerators.None.class, property = "@id")