在.net中使用JsonConvert对具有可变长度的对象进行JSON序列化
问题描述:
我需要使用.NET/Newtonsoft JsonConvert.SerializeObject方法进行一些JSON序列化。我有一个类用于存储出站变量,称为JSONVars。在.net中使用JsonConvert对具有可变长度的对象进行JSON序列化
我的问题是关于如何处理下面示例中的“答案”变量。
姓和名在循环中总是有一个返回值,所以这很容易。然而,答案部分可能在循环中有多个返回。
的理论出站JSON字符串看起来像:
{
"FirstName" : "John",
"LastName" : "Doe",
"FavoriteVacation" : "Beach",
"FavoriteState" : "FL"
.....
}
与 “...” 表示1至在循环n个可能的回报。
正如你所看到的,我发送JSON字符串的地方需要在一个格式正确的JSON格式的逗号分隔的字符串中包含它,所以我无法将Answer块作为JSON数组发送,就像这(它会失败):
{
"FirstName" : "John",
"LastName" : "Doe",
"Answers" : [
"FavoriteVacation" : "Beach",
"FavoriteState" : "FL" .....
}
我如何调整,这样我可以“添加”到JSON序列串1到n“答案”块?
这里是我的代码:
public class JSONVars
{
public string FirstName;
public string LastName;
//??? public string Answer;
}
static void Main(string[] args)
{
foreach (var objReturn in objlst)
{
JSONVars jsonvars = new JSONVars();
jsonvars.FirstName = objReturn.FirstName;
jsonvars.LastName = objReturn.LastName;
foreach (var answerobj in objReturn.SurveyAnswers)
{
if (answerobj.Vacation != null)
{
foreach (var answerobjVaca in answerobj.Vacation)
{
//???????
//answerobjVaca.QuestionText;
//answerobjVaca.AnswerText;
}
}
}
var jsonHolder = JsonConvert.SerializeObject(jsonvars);
}
}
的jsonHolder变种是正在发送到外部服务,并需要为JSON传输正确序列化。
为了简洁起见,请注意一些代码(如objReturn是如何填充的)。
答
快速和简单的解决方案是代替JSONVars
使用Dictionary<string, object>
。所以你这样做:
var dict = new Dictionary<string,object>();
dict["FirstName"] = objReturn.FirstName;
dict["LastName"] = objReturn.LastName;
foreach (var answerobj in objReturn.SurveyAnswers)
{
// it's not entirely clear where you are getting the JSON
// property names from, but assuming `QuestionText` gives you the property name
// Otherwise, adjust as necessary...
dict[answerObj.QuestionText] = answerObj.AnswerText;
}
更复杂的解决方案是编写自定义转换器(这并不困难)。然后,你可以有你的JSONVars
类是这样的:
public class JSONVars
{
public string FirstName;
public string LastName;
public Dictionary<string,object> Answers;
}
和使用您的自定义转换扁平化Answers
到您的JSON字符串。
答
你必须做这样的
{
"FirstName" : "John",
"LastName" : "Doe",
"Answers" : [
{
"Question":"FavoriteVacation",
"Answer":"Beach"
},
{
"Question": "FavoriteState",
"Answer":"FL"
}, ...
]
}
如果您需要动态添加或删除属性,请使用'Dictionary'而不是'JSONVars'类。 –