【问题标题】:JSON Deserialize Error: Parameter cannot be nullJSON反序列化错误:参数不能为空
【发布时间】: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


【解决方案1】:

以下代码有效(使用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);

但我不认为这是一个很好的方法。更改您的设计可能是一个更好的解决方案。

【讨论】:

  • 我想我终于看到了我的问题。我应该如何告诉它忽略基类?
  • @Encryption 我不知道BaseRequest 是什么。如果您发布它,我可以尝试提供帮助。
  • 发布了我的基类中的内容
  • 谢谢。绝对没想到,所以我继续进行了轻微的重构。每当我将它序列化为 Json 时,我就意识到所有被拉入的对象......嗯。
【解决方案2】:

我已经测试了你的代码,它工作正常,我所做的唯一更改是删除构造函数,我认为序列化程序由于某种原因无法在对象上创建实例,你可以删除

public Session(string url) : base(url)
{
}

【讨论】:

    【解决方案3】:

    您的代码对我来说很好,但我没有 BaseRequest 源代码,所以我用空构造函数创建了类。

    IMO 异常正是来自那里。在 Session 构造函数中, url 参数为空,因为您的 JSON 对象没有 url 属性。可能是在 BaseRequest 类中,您使用了这个 url 参数并且您收到 Value Can't be Null 错误。

    如果这是问题,您可以只更改参数的名称:

      public Session(string selfUri ) : base(selfUri)
      {
      }
    

    还要检查“响应”变量是否为空。如果将 null 传递给它的构造函数,StringReader 可能会抛出此异常。

    【讨论】:

    • 如果selfUri 是 OP 想要在基类中使用的 url,那么这是最好的答案。 (在这种情况下我会删除我的)
    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多