C# 反序列化后的c null值

C# 反序列化后的c null值,c#,json,null,C#,Json,Null,我对反序列化有问题 这是我的json结构 { "status": "ok", "data": [ { "issued": 1447358848072, "volume": "5.52565454", "currency": "pln", "limit": "724.2500", "type": "bid", "id": "2015/11/12/13328345/4836" }, {

我对反序列化有问题

这是我的json结构

{ "status": "ok", 
  "data": [
    {
      "issued": 1447358848072, 
      "volume": "5.52565454", 
      "currency": "pln", 
      "limit": "724.2500", 
      "type": "bid", 
      "id": "2015/11/12/13328345/4836"
    }, 
    {
      "issued": 1447359927423, 
      "volume": "1.25465440", 
      "currency": "pln", 
      "limit": "1850.5000", 
      "type": "ask", 
      "id": "2015/11/12/13328342/8188"
     }
  ]
}
这是我在C和函数方面的课程:

public class oferta
{
    public string issued { get; set; }
    public string volume { get; set; }
    public string currency { get; set; }
    public string limit { get; set; }
    public string type { get; set; }
    public string id { get; set; }
}

public class tBitCurex_PRV_Offers
{        
    public string status { get; set; }        
    public List<oferta> data { get; set; }
}


public void GetPRV_Offers(tBitCurex_PRV_Offers B)
        {
            try
            {
                var RSP = "my json string";

                B = JsonConvert.DeserializeObject<tBitCurex_PRV_Offers>(RSP);

                if (B.data.Count > 0)
                {
                    // in here COUNT = 2 and all works fine.
                    // and B.status = "ok"   
                    // but when function is end i have a null
                }
            }

            catch (Exception oException)
            {
                MessageBox.Show(oException.Message);
            }
        }

    public void Pobierz_PRV_Offers()
        {
            try
            {
                var BitCurexOfers = new tBitCurex_PRV_Offers();
                GetPRV_Offers(BitCurexOfers);

                if (BitCurexOfers.status == "ok")
                {
                  // do something with BitcurexOffers;
                  // I have a NULL if a use deserialize. 
                }
            }
            catch
            {
                sbInfo2.Text = "Error..xxxx";
            }
            finally
            {
                Application.DoEvents();
            }
        }
然后在函数内部和外部都可以正常工作


如何使用JsonConvert.DeserializeObject正确地执行此操作?

您的问题不在于反序列化,而在于引用指针

将函数的返回类型改为BitCurex_PRV_Ofers,而不是void,并在函数返回B的末尾;并为函数调用的结果分配位异或,而不是实例化新实例

或者只需将参数更改为

ref BitCurex_PRV_Ofers B)
之所以会发生这种情况,是因为您在B中获得一个指向BitCureXoter的指针,然后使用反序列化的结果更改该指针


如果使用JsonConvert.PoupulateB;这也适用于您,无需任何其他更改

您的问题是,您没有更改调用者中的B,而只是更改进行反序列化的方法。您可以将B更改为ref参数,也可以从方法返回它。

您的示例代码有一些错误。尝试添加此属性,它应该可以工作

[Newtonsoft.Json.JsonObjectTitle=root]
公共类tBitCurex_PRV_提供

但我不明白为什么我使用“B.status=ok”时,它没有ref就可以工作。结果也不是空的。您选择了哪一个?在那里,我提到了三种备选方案。你说,在一个类似的函数中,你设置了B.status=ok,它就可以工作了。这可能是因为你传递了B,只设置了B.status,访问了B指向的实例,而没有改变指针B,比如B=JsonConvert.Deserialize,或者像B=new-BitCurex\u-PRV\u-Ofers;。这样想吧。将实例指针B传递给函数,B指向实例a。现在,它在函数内部和外部都指向实例a。在函数中,当您执行B.status=ok时,您执行的是实例A.status=ok,这会反映到外部,因为内部和外部指针都指向实例A。但是如果您在函数中执行B=Json.Deserialize,那么,在函数内部,现在B=Instance B,而在外部,B仍然指向实例AThat's why,将指针B作为ref传递在这两种情况下都有效。如果通过ref传入,当您将B更改为B=Json.Deserialize时,B将指向实例B,并且您现在完全丢失了指向实例A的指针,因为在函数外部,B现在也指向实例B。示例和文档可能会更有用。
ref BitCurex_PRV_Ofers B)