在c#中反序列化嵌套的json对象

时间:2014-10-14 06:21:22

标签: javascript c# json

我在javascript中有json对象

{"CategoryID":"1","CountryID":"1","CountryName":"United Arab Emirates",
"BillerID":"23","AccountNo":"1234567890",
"Authenticators":"{\"ConsumerNumber\":\"1234567890\",\"LastBillDate\":\"14-10-2014\",\"LastBillDueDate\":\"24-11-2014\"}",
"ShortName":"0000000001"}

我有类似的c#class

[Serializable]
    public class UserContext
    {
        public string CategoryID { get; set; }
        public string BillerID { get; set; }
        public string AccountNo { get; set; }
        public string Authenticators { get; set; }
        public string ShortName { get; set; }
        public string CountryID { get; set; }
        public string CountryName { get; set; }
    }

我可以将c#中的每个元素值作为

UserContext obj1 = Deserialize<UserContext>(context);

但由于Authenticators是嵌套的json对象,我希望C#

中有类似的内容
[Serializable]
    public class Authenticators
    {
        public string ConsumerNumber { get; set; }
        public string LastBillDate { get; set; }
        public string LastBillDueDate { get; set; }
    }

这样我就可以得到每个Authenticators元素的每个值,如

string value = obj.ConsumerNumber;

我想用值填充两个类。我怎样才能实现同样的目标?

3 个答案:

答案 0 :(得分:1)

您的UserContext类有一个字符串字段Authenticators,而json结构表明它是一个对象。

更改

public string Authenticators { get; set; }

public Authenticators Authenticators { get; set; }

然后,您可以将UserContext对象与嵌套对象Authenticators

一起反序列化
UserContext obj1 = Deserialize<UserContext>(context);
var consumerNumber = obj1.Authenticators.ConsumerNumber;

更新:

您可能需要修复javascript代码,因为现在它将已经序列化的json字符串存储为UserContext对象中的字符串字段。

你现在拥有的东西类似于:

var data =
 {
   CategoryID:"1",
   Authenticators: JSON.stringify({ConsumerNumber:"1234567890"})
 };
 var json = JSON.stringify(data);

应该是这样的:

var data =
 {
   CategoryID:"1",
   Authenticators:{ConsumerNumber:"1234567890"}
 };
 var json = JSON.stringify(data);

答案 1 :(得分:0)

在对外部对象进行反序列化后,可以对Authenticators JSON字符串运行另一个反序列化,该字符串现在是obj1上的属性。

这是必需的,因为您的Authenticators是字符串,它被转义,因此在反序列化外部对象之前无法反序列化。

Authenticators obj2 = Deserialize<Authenticators>(obj1.Authenticators);
string value = obj2.ConsumerNumber;

答案 2 :(得分:0)

只需更改

public string Authenticators { get; set; }

public Authenticators Authenticators { get; set; }

然后您只需通过

即可访问内部对象的属性
var number = obj1.Authenticators.ConsumerNumber;

但我注意到你的JSON在使用Newtonsoft进行反序列化时遇到了一些问题,我不得不将JSON字符串中Authenticators的值更改为

'Authenticators':{'ConsumerNumber':'1234567890','LastBillDate':'14-10-2014','LastBillDueDate':'24-11-2014'},

只需删除反斜杠

即可