【发布时间】:2014-06-18 15:16:15
【问题描述】:
无法从其他 Json 序列化问题中找到答案,所以也许有人可以帮助我:
我从 REST api 获取 JSON 对象并尝试将其反序列化为对象。下面是我收到的 JSON 对象:
{"id":"6wVcZ9ZF67ECUQ8xuIjFT2",
"userId":"83ca0ab5-3b7c-48fe-8019-000320081b00",
"authorizations":["employee","API","trainer","queueAdmin","supervisor","workflowAdmin","realtimeManager","forecastAnalyst","qualityEvaluator","contactCenterManager","teamLead","personnelAdmin","telephonyAdmin","qualityAdmin","businessAdmin","businessUser","accountAdmin","dialerAdmin","contentManagementUser","contentManagementAdmin","admin","api","scriptDesigner","agent","user"],
"primaryAuthorization":"employee",
"thirdPartyOrgName":"in",
"username":"somebody",
"selfUri":"https://blahblahblah.com/api/v1/auth/sessions/6wVcZ9ZF67ECUQ8xuIjFT2"}
我正在尝试将我的对象反序列化为:
[Serializable]
public class Session : BaseRequest, ISession
{
public Session(string url) : base(url)
{
}
#region Members
[JsonProperty(PropertyName = "userId")]
public string UserId { get; set; }
[JsonProperty(PropertyName = "authorizations")]
public object[] Authorizations { get; set; }
[JsonProperty(PropertyName = "primaryAuthorization")]
public string PrimaryAuthorization { get; set; }
[JsonProperty(PropertyName = "thirdPartyOrgName")]
public string ThirdPartyOrgName { get; set; }
[JsonProperty(PropertyName = "username")]
public string Username { get; set; }
[JsonProperty(PropertyName = "id")]
public string Id { get; set; }
[JsonProperty(PropertyName = "selfUri")]
public string SelfUri { get; set; }
#endregion
}
我只是发出网络请求并使用流阅读器获取响应流并返回字符串。很标准。
但是,当我尝试反序列化到我的 Session 对象时,它总是会抛出一个错误:Value Cannot be Null
var serializer = new JsonSerializer();
response = MakePostRequest(true);
var obj = serializer.Deserialize<Session>(new JsonTextReader(new StringReader(response)));
响应是我从网络请求返回的 JSON 字符串,与我上面指定的完全一致。
我以前做过,但通常我是设计 REST api 的人。这次不是这种情况,但我一生都无法弄清楚为什么这不会反序列化?我已经指定了 JSonProperty PropertyName 以避免出现正确大小写的问题,这可能不正常吗?任何帮助表示赞赏!
UDPATE
我想我找到了问题的一部分。它试图反序列化我的基类,其中包括:
public abstract class BaseRequest
{
protected BaseRequest(string apiUrl)
{
ApiUrl = apiUrl;
Request = (HttpWebRequest)WebRequest.Create(apiUrl);
}
public string ApiUrl { get; set; }
public string JsonPayload { get; set; }
public HttpWebRequest Request { get; private set; }
}
我可以给出任何指令来阻止它这样做吗?还是我需要围绕这个进行重构?
【问题讨论】:
-
你的代码对我来说很好用。只需给我们完整的异常消息/堆栈跟踪。您确定响应不为 null 吗?如果将 null 传递给 StringReader 构造函数,则可以得到此异常。其他选项是来自 BaseRequest 构造函数的异常。也发布它的代码:)
标签: c# json serialization deserialization