gpt4 book ai didi

ServiceStack 返回 JSV 而不是 JSON

转载 作者:行者123 更新时间:2023-12-04 05:29:12 25 4
gpt4 key购买 nike

我有一个用 ServiceStack 创建的服务。最近我更新了 ServiceStack 库,现在我得到的是 JSV 响应而不是 JSON 响应。

该请求类似于:

POST http://localhost/api/rest/poll/create?format=json&PollFormat=1 HTTP/1.1
Host: localhost
Connection: keep-alive
Content-Length: 160
Accept: */*
Origin: http://localhost
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
DNT: 1
Referer: http://localhost
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie:

Question=this+is+a+test&Answers=yes%2Cno&

响应类似于:
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/7.5
X-Powered-By: ServiceStack/3.956 Win32NT/.NET
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 12 Aug 2013 21:20:33 GMT
Content-Length: 437

{Id:1,Question:this is a test,Answers:[{Id:1,Text:yes,Votes:0},{Id:2,Text:no,Votes:0}],IsOpen:1,TotalVotes:0}}

请注意,我已将响应中的 JSV 精简了一点以使其更易于阅读,因此,示例的 Content-Length 将不正确。

据我了解,ServiceStack 的默认 ContentType 应该是 JSON

那么为什么我要使用 application/json 的 ContentType 取回 JSV?

编辑:

这是我的请求 dto 的样子:
[Route("/poll/create", Verbs = "POST")]
public class PollRequest : IReturn<Object>
{
public string Question { get; set; }
public string Answers { get; set; }
public int? PollFormat { get; set; }
}

这是我的服务的样子:
public class PollService : Service
{
public object Post(PollRequest request)
{
//
// do work required to create new poll
//
Poll p = new Poll();
if(request.PollFormat.HasValue)
{
return JsonSerializer.DeserializeFromString<object>(p.JSON);
}
else
{
return PostConvertor.ConvertTo(p);
}
}
}

这是我的民意调查回复的样子:
public class Poll
{
public int Id { get; set; }
public string Question { get; set; }
public Collection<Answer> Answers { get; set; }
public int IsOpen { get; set; }
public int TotalVotes { get; set; }

public class Answer
{
public int Id { get; set; }
public string Text { get; set; }
public int Votes { get; set; }
}
}

最佳答案

事实证明,我们有一个参数被发送到定义如何返回响应的服务。如果设置了参数,我们将手动生成一个 JSON 字符串(由我编辑的问题中的 p.JSON 属性表示),然后从该字符串返回一个反序列化的对象,如下所示:

return JsonSerializer.DeserializeFromString<object>(p.JSON)

在以前版本的 ServiceStack 中,反序列化的对象似乎会产生一个内容与输入 JSON 相同的字符串(不知道为什么我们这样做,因为这似乎是在浪费 CPU)。较新版本的 ServiceStack 似乎也将 JSON 反序列化为字符串,但该字符串使用 JSV 格式。

我认为我们这样做的原因(虽然我不确定)是我们试图从 JSON 获取一个通用对象,以便当我们返回它时,它可以根据请求者想要的内容转换为 JSON 或 XML。但是当前的实现总是返回一个 JSON 格式的字符串,所以如果我只是替换
return JsonSerializer.DeserializeFromString<object>(p.JSON)


return p.JSON

然后我想我会保持回复原样。

关于ServiceStack 返回 JSV 而不是 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18197080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com