【问题标题】:JSON serialization of an object with a variable length using JsonConvert in .net在 .net 中使用 JsonConvert 对具有可变长度的对象进行 JSON 序列化
【发布时间】:2017-04-26 14:45:20
【问题描述】:

我需要一些使用 .NET/Newtonsoft JsonConvert.SerializeObject 方法的 JSON 序列化方面的帮助。我有一个用于存储出站变量的类,称为 JSONVars。

我的问题是关于如何处理以下示例中的“答案”变量。

名字和姓氏在循环中总是有一个返回,所以这很容易。然而,答案部分可能在一个循环中有多个返回。

理论上的出站 JSON 字符串如下所示:

{ 
    "FirstName" : "John", 
    "LastName" : "Doe", 
    "FavoriteVacation" : "Beach", 
    "FavoriteState" : "FL" 
    ..... 
} 

用“...”表示循环中的 1 到 n 个可能的返回值。

如您所见,我发送 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 var 是发送到外部服务的内容,需要正确序列化以进行 JSON 传输。

请注意一些代码(如 objReturn 的填充方式)为简洁起见而省略了。

【问题讨论】:

  • 如果您需要动态添加或删除属性,请使用 Dictionary<string, object> 而不是 JSONVars 类。

标签: c# .net json json.net


【解决方案1】:

快速简便的解决方案是使用Dictionary<string, object> 代替JSONVars。所以你做这样的事情:

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 字符串。

【讨论】:

  • 所以,在第一个“快速而肮脏”的例子中,一旦 dict 对象被一个通过整个循环填充(我的意思是 FirstName + LastName + [n] Question/Answer “nodes "),我可以通过 JsonConvert.SerializeObject() 序列化字典吗?
  • @optionsix:是的
【解决方案2】:

你必须这样做

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    相关资源
    最近更新 更多