我使用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;
}
}
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>
答案 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}},根对象必须是object
或array
,因此解析器在character 0
失败。
如果切换到contentType HttpContentTypes.Text
,则会以如下方式启动:
[{"linkToIdeaBook":"/u/3FO4K4UR89F1/huabao","linkToDesignCollect":"/u
实际上它是一个有效的JSON对象。
对我而言,如果您要求内容类型为JSON的内容,您会获得一个转义字符串,但这似乎是失败的根本原因,这似乎有些奇怪。
如何解决它更难说。前进的方法是使用PR to FSharp.Data,以允许用户指定用于下载内容的内容类型。