从Spring Controller

时间:2016-06-02 14:59:22

标签: java json spring controller jsonobject

我想模拟一些JSON(我正在从文件中读取),并将其作为一些Spring Controller的结果返回。

文件当然包含正确的JSON数据格式,例如:

{"country":"","city":""...}

我的控制器如下:

@RestController
@RequestMapping("/test")
public class TestController {

    @Value("classpath:/META-INF/json/test.json")
    private Resource testMockup;

    @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody JSONObject getTest() throws IOException {
        JSONObject jsonObject = new JSONObject(FileUtils.readFileToString(testMockup.getFile(), CharEncoding.UTF_8));
        return jsonObject;
    }
}

阅读文件本身等没有问题。 jsonObject本身,从debout PoV是正确的,但是我从浏览器中获取 HTTP Status 406 。 我还尝试过返回String(返回jsonObject.toString()),而不是JSONObject。 但是它会导致编码问题 - 所以来自浏览器的JSON不是JSON本身(一些额外的斜杠,引号等)。

有什么办法可以从文件中返回JSON吗?

5 个答案:

答案 0 :(得分:2)

@Controller
public class TestController {

    @RequestMapping(
      value = "/test", 
      method = RequestMethod.GET, 
      produces = MediaType.APPLICATION_JSON_VALUE
    )

    String getTest() {
        return "json/test.json";
    }
}

这对我有用。

JSON文件的路径:\src\main\resources\static\json\test.json

答案 1 :(得分:1)

这对我有用。

Java:

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.io.*;

@RestController("/beers")
public class BeersController {

    @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody
    Object getBeers() {
        Resource resource = new ClassPathResource("/static/json/beers.json");
        try {
            ObjectMapper mapper = new ObjectMapper();
            return mapper.readValue(resource.getInputStream(), Object.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

}

科特克林:

import com.fasterxml.jackson.databind.ObjectMapper
import org.springframework.core.io.ClassPathResource
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

@RestController
@RequestMapping("/beers")
class BeersController {

    @GetMapping
    fun getBeers(): Any? {
        val resource = ClassPathResource("/static/json/beers.json")
        return ObjectMapper().readValue(resource.inputStream, Any::class.java)
    }

}

答案 2 :(得分:0)

这不是有效的JSON。如果不是拼写错误,请尝试将文件重新格式化为

{"country":"","city":""}

请注意属性名称周围的开头引号。

答案 3 :(得分:0)

你有没有尝试过杰克逊?

ObjectMapper mapper = new ObjectMapper();
Object json = mapper.readValue(input, Object.class);
String s = mapper.writeValueAsString(json);

也许直接把它写到回应体上?杰克逊应该照顾json。

答案 4 :(得分:-1)

我知道我已经很晚了,但为什么不尝试下面的解决方法。

@RequestMapping(method = RequestMethod.GET)
public @ResponseBody String getTest() throws IOException {
    JSONObject jsonObject = new JSONObject(FileUtils.readFileToString(testMockup.getFile(), CharEncoding.UTF_8));
    return jsonObject.toString();
}