JSON反序列化错误:参数不能为空

时间:2014-06-18 15:16:15

标签: c# json serialization deserialization

无法找到其他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; }
}

我是否有任何指示可以阻止它这样做?或者我需要围绕这个进行重构吗?

3 个答案:

答案 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可以抛出此异常。