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,根对象必须是 object
或 array
,因此解析器在 character 0
.
处失败
如果切换到 contentType HttpContentTypes.Text
,它会这样开始:
[{"linkToIdeaBook":"/u/3FO4K4UR89F1/huabao","linkToDesignCollect":"/u
这实际上是一个有效的 JSON 对象。
对我来说,如果您请求内容类型为 JSON 的内容,您会得到一个转义字符串,这似乎有点奇怪,但这似乎是失败的根本原因。
怎么解决就比较难说了。一种前进的方式是 FSharp.Data 的 PR,以允许用户指定用于下载内容的内容类型。
我使用 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,根对象必须是 object
或 array
,因此解析器在 character 0
.
如果切换到 contentType HttpContentTypes.Text
,它会这样开始:
[{"linkToIdeaBook":"/u/3FO4K4UR89F1/huabao","linkToDesignCollect":"/u
这实际上是一个有效的 JSON 对象。
对我来说,如果您请求内容类型为 JSON 的内容,您会得到一个转义字符串,这似乎有点奇怪,但这似乎是失败的根本原因。
怎么解决就比较难说了。一种前进的方式是 FSharp.Data 的 PR,以允许用户指定用于下载内容的内容类型。