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

时间:2015-10-08 08:36:39

标签: f# f#-data

我使用springMVC编写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只返回enter image description here
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>

1 个答案:

答案 0 :(得分:2)

我查看了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
  }

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

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

请注意,内容以"开头,&#34;字符串&#34;是&#34;逃脱&#34;与\。因此,似乎JSON文档作为转义string返回。根据{{​​3}},根对象必须是objectarray,因此解析器在character 0失败。

如果切换到contentType HttpContentTypes.Text,则会以如下方式启动:

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

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

对我而言,如果您要求内容类型为JSON的内容,您会获得一个转义字符串,但这似乎是失败的根本原因,这似乎有些奇怪。

如何解决它更难说。前进的方法是使用PR to FSharp.Data,以允许用户指定用于下载内容的内容类型。