Newtonsoft JSON - 在JArray中创建JArray

时间:2014-06-20 14:10:14

标签: c# json windows-phone-8 json.net

我正在尝试使用Newtonsoft JSON API创建JSON数组,但它给了我错误。我想实现像

这样的结构
[

    {
        "id":"26",
        "appsurvey":"1",
        "fk_curriculumid":"70",
        "status":"Completed",
        "lastaccessedon":"2014-06-20 09:18:54",
        "questions":[
            {
                "feedback":"6",
                "questionid":"1"
            },
            {
                "feedback":"8",
                "questionid":"2"
            },
            {
                "feedback":"1",
                "questionid":"3"
            }
        ],
        "fk_clientid":"24",
        "learnerid":"260"
    }

]

我想要多次添加问题数组,但它给了我错误 Can not add property questions to Newtonsoft.Json.Linq.JObject. Property with the same name already exists on object.

这是我的代码:

JArray surveytrackingA = new JArray();
/*code to add
[

    {"id":"26",
        "appsurvey":"1",
        "fk_curriculumid":"70",
        "status":"Completed",
        "lastaccessedon":"2014-06-20 09:18:54"}]
*/
for (int i = 0; i < surveytrackingA.Count; i++)
{

    JObject surveytrackD = (JObject)surveytrackingA[i];
    string queryOne = "select * from table101 where fk_curriculumid='"
            + surveytrackD["fk_curriculumid"].ToString()
            + "' and fk_surveyid='"
            + surveytrackD["appsurvey"].ToString() + "'";

    JArray questionsA = new JArray();

    using (var stmt = await App.localDB.PrepareStatementAsync(queryOne))
    {
        while (await stmt.StepAsync())
        {
            JObject questionD = new JObject();
            questionD.Add("questionid", stmt.GetTextAt(5));
            questionD.Add("feedback", stmt.GetTextAt(6));
            questionsA.Add(questionD);
        }
    }                    
    surveytrackD.Add("questions", questionsA); /*error occurred here when second question array is getting inserted in surveyTrackD*/
    surveytrackingA.Add(surveytrackD);
}

任何人都可以纠正我。提前谢谢。

更新: surveytrackD有json数据,

{
  "fk_clientid": "24",
  "learnerid": "260",
  "appsurvey": "1",
  "id": "26",
  "fk_curriculumid": "70",
  "status": "completed",
  "lastaccessedon": "2014-06-20 09:18:54"
}

1 个答案:

答案 0 :(得分:0)

您可以使用常规C#类实现相同的结果(JArray中的JArray),最后序列化为JSon。

我在Github发布了一个示例;这里是产生预期输出的代码片段:

        var Surveys = new List<SurveytrackD>();

        Surveys.Add( new SurveytrackD { id = "26", appsurvey = "1", fk_curriculumid = "70", status = "Completed", learnerid = "240"  } );
        Surveys.Add( new SurveytrackD { id = "27", appsurvey = "1", fk_curriculumid = "71", status = "Completed", learnerid = "241" });


        foreach (var survey in Surveys)
        {
            survey.questions = new List<Question>();

            survey.questions.Add(new Question { questionid = "1", feedback = "0" });
            survey.questions.Add(new Question { questionid = "2", feedback = "1" });
        }

        var json = JsonConvert.SerializeObject(Surveys, Formatting.Indented);

        Console.WriteLine(json);

输出结果为:

[
  {
    "fk_clientid": null,
    "learnerid": "240",
    "appsurvey": "1",
    "id": "26",
    "fk_curriculumid": "70",
    "status": "Completed",
    "lastaccessedon": null,
    "questions": [
      {
        "feedback": "0",
        "questionid": "1"
      },
      {
        "feedback": "1",
        "questionid": "2"
      }
    ]
  },
  {
    "fk_clientid": null,
    "learnerid": "241",
    "appsurvey": "1",
    "id": "27",
    "fk_curriculumid": "71",
    "status": "Completed",
    "lastaccessedon": null,
    "questions": [
      {
        "feedback": "0",
        "questionid": "1"
      },
      {
        "feedback": "1",
        "questionid": "2"
      }
    ]
  }
]