JsonProvider 无法从我自己编写的 API 中解析 JSON

JsonProvider failed to parse JSON from API written myself

我使用 springMVC.It 写了一个 API 一个简单的 API,我只是用它来测试 JsonProvider。

@ResponseBody
@RequestMapping(value = "/api/test", method = RequestMethod.GET)
public TestClass test(final HttpServletRequest request,
        final HttpServletResponse response){
    return new TestClass("cc");
}

class TestClass{

    public TestClass(){

    }
    public TestClass(final String name) {
        super();
        this.name = name;
    }

    private String name;

    public String getName() {
        return name;
    }

    public void setName(final String name) {
        this.name = name;
    }

}

API简直returns
但是 JsonProvider 只是抛出一个编译错误。

    Severity    Code    Description Project File    Line
    Error       The type provider 'ProviderImplementation.JsonProvider' reported an error: Cannot read sample JSON from 'http://localhost/api/test': Invalid JSON starting at character 0, snippet = 
    ----
    "{\"name\":
    -----
    json = 
    ------
    "{\"name\":\"cc\"}"
    ------- JsonProcess c:\users\xx\documents\visual studio 2015\Projects\JsonProcess\JsonProcess\Program.fs    8

F#代码:

    open FSharp.Data

    [<Literal>]
    let jsonValue = """
    {"name":"cc"}
    """

    type JsonData = JsonProvider<"http://localhost/api/test">

    [<EntryPoint>]
    let main argv = 
        0 // return an integer exit code

使用字符串文字 jsonValue 作为示例就可以了。type JsonData = JsonProvider<jsonValue>

我检查了 FSharp.Data source code(它的函数 asyncRead),看看他们如何下载 JSON。基本上可以归结为:

let readString =
  async {
    let contentTypes  = [ HttpContentTypes.Json ]
    let headers       = [ 
                          HttpRequestHeaders.UserAgent ("F# Data JSON Type Provider") 
                          HttpRequestHeaders.Accept (String.concat ", " contentTypes) 
                        ]
    let! text     = Http.AsyncRequestString("http://www.kujiale.com/api/askinvitesearch?query=cc", headers = headers) 

    return text
  }

如果针对 url http://www.kujiale.com/api/askinvitesearch?query=cc 运行此代码,我们会看到一些关于返回内容的有趣信息:

"[{\"linkToIdeaBook\":\"/u/3FO4K4UR89F1/huabao\",\"linkToDesi

请注意,内容以 " 开头,"strings" 是 "escaped" 和 \。因此,JSON 文档似乎作为转义的 string 返回。根据 json.org,根对象必须是 objectarray,因此解析器在 character 0.

处失败

如果切换到 contentType HttpContentTypes.Text,它会这样开始:

[{"linkToIdeaBook":"/u/3FO4K4UR89F1/huabao","linkToDesignCollect":"/u

这实际上是一个有效的 JSON 对象。

对我来说,如果您请求内容类型为 JSON 的内容,您会得到一个转义字符串,这似乎有点奇怪,但这似乎是失败的根本原因。

怎么解决就比较难说了。一种前进的方式是 FSharp.Data 的 PR,以允许用户指定用于下载内容的内容类型。