C# 在c语言中解析嵌套的json字符串#

C# 在c语言中解析嵌套的json字符串#,c#,json,C#,Json,我将json字符串作为 {"AccountNo":"345234533466","AuthValue":"{\"TopUpMobileNumber\":\"345234533466\",\"VoucherAmount\":\"100\"}"} 为了解析这个字符串,我创建了一个 public class UserContext { public string AccountNo { get; set; } public string AuthValue { get; set; }

我将json字符串作为

{"AccountNo":"345234533466","AuthValue":"{\"TopUpMobileNumber\":\"345234533466\",\"VoucherAmount\":\"100\"}"}
为了解析这个字符串,我创建了一个

public class UserContext
{
    public string AccountNo { get; set; }
    public string AuthValue { get; set; }
}
在AuthValue中,它给我的输出是
{“TopUpMobileNumber\”:“345234533466\”,“VoucherAmount\”:“100\”}
,这是绝对正确的。现在我想修改我的类,这样我就需要字符串格式和seprate成员变量格式的
AuthValue

所以我用这种方式修改了我的类,但它给出了错误

public class UserContext
{
    public string AccountNo { get; set; }
    public string AuthValue { get; set; }
    public Auth ????? { get; set; }
}

 public class Auth
{
    public string TopUpMobileNumber { get; set; }
    public string VoucherAmount { get; set; }
}
我的要求是

  • AuthValue需要整个json字符串
  • 在另一个变量中,我需要成员值
  • 解析逻辑

    UserContext conObj1 = new UserContext();
    conObj1 = JsonConvert.DeserializeObject<UserContext>(context);
    
    UserContext conObj1=newusercontext();
    conObj1=JsonConvert.DeserializeObject(上下文);
    

    注意:不允许修改json字符串。

    我对JsonConvert或json.NET不是很熟悉,所以我不确定有哪些选项可供选择。就我个人而言,我会马上再打电话给反序列化程序

    UserContext conObj1 = new UserContext();
    conObj1 = JsonConvert.DeserializeObject<UserContext>(context);
    conObj1.AuthObject = JsonConvert.DeserializeObject<Auth>(conObj1.AuthValue);
    
    UserContext conObj1=newusercontext();
    conObj1=JsonConvert.DeserializeObject(上下文);
    conObj1.AuthObject=JsonConvert.DeserializeObject(conObj1.AuthValue);
    
    如果需要,可以将其移动到类中,并直接从反序列化类调用它

    public class UserContext
    {
        public string AccountNo { get; set; }
        public string AuthValue { get; set; }
        public Auth AuthObject { get; private set; }
    
        internal UserContext Deserialize()
        {
            // Serialize the object
            this.AuthObject = JsonConvert.DeserializeObject<Auth>(this.AuthValue);
    
            // Return this object for a simple single-line call.
            return this;
        }
    }
    
    // Single object
    UserContext conObj1 = new UserContext();
    conObj1 = JsonConvert.DeserializeObject<UserContext>(context).Deserialize();
    
    // Enumeration of object (given that this is supported in JsonConvert)
    IEnumerable<UserContext> conObjs = JsonConvert.DeserializeObject<IEnumerable<UserContext>(contexts).Select(c => c.Deserialize()).ToList();
    
    公共类用户上下文
    {
    公共字符串AccountNo{get;set;}
    公共字符串AuthValue{get;set;}
    公共身份验证对象{get;private set;}
    内部UserContext反序列化()
    {
    //序列化对象
    this.AuthObject=JsonConvert.DeserializeObject(this.AuthValue);
    //为简单的单行调用返回此对象。
    归还这个;
    }
    }
    //单个对象
    UserContext conObj1=新的UserContext();
    conObj1=JsonConvert.DeserializeObject(上下文).Deserialize();
    //对象枚举(假定JsonConvert支持此操作)
    IEnumerable conObjs=JsonConvert.DeserializeObject c.Deserialize()).ToList();
    
    或者,如果您感到自怨自艾,您可以在访问属性时进行反序列化(尽管我会不惜一切代价避免这种情况,因为它可能导致许多问题)

    公共类用户上下文
    {
    私人授权m_Auth;
    公共字符串AccountNo{get;set;}
    公共字符串AuthValue{get;set;}
    公共身份验证对象
    {
    得到
    {
    if(this.m_auth==null)
    {
    this.m_auth=JsonConvert.DeserializeObject(this.AuthValue);
    }
    返回此.m_auth;
    }
    }
    }
    
    我建议使用两个类—一个用于实际接收的JSON,另一个用于要使用的对象模型:

    公共类JsonUserContext
    {
    公共字符串AccountNo{get;set;}
    公共字符串AuthValue{get;set;}
    }
    公共类用户上下文
    {
    公共字符串AccountNo{get;set;}
    公共身份验证身份验证值{get;set;}
    }
    公共类身份验证
    {
    公共字符串TopUpMobileNumber{get;set;}
    公共字符串VoucherAmount{get;set;}
    }
    ...
    var jsonUserContext=JsonConvert.DeserializeObject(json);
    var authJson=jsonUserContext.AuthValue;
    var userContext=newusercontext{
    AccountNo=jsonUserContext.AccountNo,
    AuthValue=JsonConvert.DeserializeObject(authJson);
    };
    
    是的,它会给您一个错误——一方面是因为您试图声明两个同名的成员。但修复起来相当容易,至少使用JSON.NET是如此。(不幸的是,我现在没有时间发布答案…)问题是,如果我修改我的变量名,我将无法解析
    json
    string您试图使用一个类来表示两个不同的东西-一个是字符串,另一个是对象。我们不知道您在JSON解析中使用的是什么,这没有帮助。@JonSkeet我使用
    JsonConvert
    作为旁白,使用
    SomeType x=new SomeType();x=某个表达式几乎总是毫无意义的。只需使用
    SomeType x=someExpression。为什么要创建一个你不需要的对象?我有一个类似的问题。(我环顾四周,直到现在才找到类似的问题)。您认为现在有更好的方法直接解析嵌入的Json字符串吗?我的问题在我看来不是重复的。目前,我正在单独解析嵌入的json字符串。寻找更直接的方法。@AdithyaUpadhya:不,我不这么认为。
    
    public class UserContext
    {
        private Auth m_auth;
    
        public string AccountNo { get; set; }
        public string AuthValue { get; set; }
        public Auth AuthObject
        {
            get
            {
                if (this.m_auth == null)
                {
                    this.m_auth = JsonConvert.DeserializeObject<Auth>(this.AuthValue);
                }
    
                return this.m_auth;
            }
        }
    }
    
    public class JsonUserContext
    {
        public string AccountNo { get; set; }
        public string AuthValue { get; set; }
    }
    
    public class UserContext
    {
        public string AccountNo { get; set; }
        public Auth AuthValue { get; set; }
    }
    
    public class Auth
    {
        public string TopUpMobileNumber { get; set; }
        public string VoucherAmount { get; set; }
    }
    
    ...
    
    var jsonUserContext = JsonConvert.DeserializeObject<JsonUserContext>(json);
    var authJson = jsonUserContext.AuthValue;
    var userContext = new UserContext {
        AccountNo = jsonUserContext.AccountNo,
        AuthValue = JsonConvert.DeserializeObject<JsonUserContext>(authJson);
    };