无法从@Controller 类中返回 JSON 数组,抛出 No serializer found for class org.json.JSONObject 错误 [重复]

Posted

技术标签:

【中文标题】无法从@Controller 类中返回 JSON 数组,抛出 No serializer found for class org.json.JSONObject 错误 [重复]【英文标题】:Unable to return JSON Array from the @Controller class throwing No serializer found for class org.json.JSONObject error [duplicate] 【发布时间】:2018-11-19 17:54:43 【问题描述】:

我正在使用 @Controller 通过 ActiveMQ 从 Elasticsearch 获取文档。我正在使用参数调用我的客户端方法并从 Elastic Search 作为 JSONArray 获得响应,但是从我的 @Controller 类返回 JSONArray 时出现以下错误

请在下面找到我的错误。

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.json.JSONObject and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) ~[jackson-databind-2.9.5.jar:2.9.5]
at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1191) ~[jackson-databind-2.9.5.jar:2.9.5]
at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:312) ~[jackson-databind-2.9.5.jar:2.9.5]
at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:71) ~[jackson-databind-2.9.5.jar:2.9.5]

请找到我的@Controller 类和我的@ResponseBody 方法

@Controller
public class SearchProductWebService 
    private static final String DOCUMENTS = "/document/name";
    private static final Logger logger = Logger.getLogger(SearchProductWebService.class.getName());

    com.demo.earchengineclient.Client searchEngineClient = com.demo.searchengineclient.Client.getInstance();

    @RequestMapping(value = DOCUMENTS, method = RequestMethod.GET)
    public @ResponseBody Object getDocumentByName(HttpServletRequest httpRequest, HttpServletResponse httpResponse, @PathVariable("name") String name) 
        System.out.println("Search Documents--->"+searchEngineClient.searchByDocuments("arthi"));
        return searchEngineClient.searchByDocuments(name);
    


请找到我的客户端代码实现:

public JSONArray searchByDocuments(String name) 
    JSONObject request = new JSONObject();
    request.put("method", "search_by_documents");
    request.put("name", name);
    this.start();
    JSONObject response = producer.post(request, 60);
    this.stop();
    return response.getJSONArray("result");

【问题讨论】:

【参考方案1】:

您的 Jackson 配置设置为在空结果时失败。 从你的例外:

(to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)

但是,可能还有其他原因。没有看到com.demo.earchengineclient.Client的实现很难说。 如果可能,尝试将 JSONObject 替换为 JsonObject(来自 javax.json,Java 8 附带的那个)。

【讨论】:

我已经更新了我的客户端代码实现。如果我单独调用我的客户端代码,我能够毫无问题地在 JSONArray 中获得响应。但是如果我通过 SpringBoot @Controller 调用我会收到此错误。

以上是关于无法从@Controller 类中返回 JSON 数组,抛出 No serializer found for class org.json.JSONObject 错误 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

(04)Spring MVC之Get方式传参访问Controller,从Controller返回json串出现菱形问号(?????)乱码,解决方法。

SpringMVC返回JSON数据

SpringBoot2 使用@RestController 无法返回一个地址,前台无法渲染为页面,只能返回json数据

springmvc实现ajax的问题

【springboot 入门篇】第3篇 从controller开始学起

如何使用angularjs从json文件中获取数据