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

时间:2014-11-07 07:20:50

标签: c# json

我有json字符串

{"AccountNo":"345234533466","AuthValue":"{\"TopUpMobileNumber\":\"345234533466\",\"VoucherAmount\":\"100\"}"}

解析这个字符串我创建了类

public class UserContext
{
    public string AccountNo { get; set; }
    public string AuthValue { get; set; }
}
<\ n>在AuthValue中,它为我输出{\"TopUpMobileNumber\":\"345234533466\",\"VoucherAmount\":\"100\"}这绝对是正确的。现在我想以这样的方式修改我的类,我想要{string}格式的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; }
}

我的要求是

  1. 我需要AuthValue整个json字符串
  2. 在另一个变量中我想要成员明智的值
  3. 解析逻辑

    UserContext conObj1 = new UserContext();
    conObj1 = JsonConvert.DeserializeObject<UserContext>(context);
    

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

2 个答案:

答案 0 :(得分:2)

我对JsonConvert或Json.NET不太熟悉,所以我不确定有哪些选项可用。我个人之后立即再次呼叫解串器。

UserContext conObj1 = new UserContext();
conObj1 = JsonConvert.DeserializeObject<UserContext>(context);
conObj1.AuthObject = JsonConvert.DeserializeObject<Auth>(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();

或者如果你觉得自己很讨厌,你可以在访问该属性时进行反序列化(尽管由于它可能导致的许多问题,我几乎不惜一切代价来避免这种情况)。

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;
        }
    }
}

答案 1 :(得分:2)

我建议使用两个类 - 一个用于您实际接收的JSON,然后一个用于您想要使用的对象模型:

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);
};