2017-04-26 47 views
2

我需要使用.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是如何填充的)。

+1

如果您需要动态添加或删除属性,请使用'Dictionary '而不是'JSONVars'类。 –

回答

2

快速和简单的解决方案是代替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字符串。

+0

因此,在第一个“快速和肮脏”的例子中,一旦dict对象填充了整个循环中的一个遍历(我的意思是FirstName + LastName + [n] Question/Answer节点),我可以序列化字典通过JsonConvert.SerializeObject()? – optionsix

+0

@optionsix:是的 –

+0

这工作得很好,谢谢! – optionsix

0

你必须做这样的

{ 
    "FirstName" : "John", 
    "LastName" : "Doe", 
    "Answers" : [ 
     { 
      "Question":"FavoriteVacation", 
      "Answer":"Beach" 
     }, 
     { 
      "Question": "FavoriteState", 
      "Answer":"FL" 
     }, ... 
    ] 
}