C# 在c语言中解析嵌套的json字符串#
我将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; }
{"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; }
}
我的要求是
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);
};