无法找到其他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
}
我只是使用流阅读器创建Web请求并获取响应流并返回字符串。很标准。
但是,当我尝试反序列化为我的Session对象时,它总是会抛出错误:值不能为空
var serializer = new JsonSerializer();
response = MakePostRequest(true);
var obj = serializer.Deserialize<Session>(new JsonTextReader(new StringReader(response)));
响应是我从Web请求返回的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; }
}
我是否有任何指示可以阻止它这样做?或者我需要围绕这个进行重构吗?
答案 0 :(得分:0)
以下代码有效(使用Json.Net):
var session = JsonConvert.DeserializeObject<Session>(json);
public class Session
{
public string Id { get; set; }
public string UserId { get; set; }
public List<string> Authorizations { get; set; }
public string PrimaryAuthorization { get; set; }
public string ThirdPartyOrgName { get; set; }
public string Username { get; set; }
public string SelfUri { get; set; }
}
修改强>
我该怎么告诉它忽略基类?
var session = (Session)System.Runtime.Serialization.FormatterServices.GetSafeUninitializedObject(typeof(Session));
JsonConvert.PopulateObject(DATA, session);
但我不认为这是一种很好的方式。更改设计可能是更好的解决方案。
答案 1 :(得分:0)
我已经测试了你的代码并且它运行正常,只有我做的更改是删除了构造函数,我认为序列化程序由于某种原因无法在对象上创建实例,你可以删除
public Session(string url) : base(url)
{
}
答案 2 :(得分:0)
你的代码对我来说很好,但是我没有BaseRequest源代码所以我用空构造函数创建了类。
IMO异常即将来临。在Session构造函数中,url参数为null,因为您的JSON对象没有url属性。可能在BaseRequest类中使用此url参数,并且您收到的值不能为Null错误。
如果出现此问题,您可以只更改参数名称:
public Session(string selfUri ) : base(selfUri)
{
}
同时检查“&#39;响应&#39;变量为null。如果将null传递给其构造函数,StringReader可以抛出此异常。