【问题标题】:Newtonsoft JSON - create JArray in JArrayNewtonsoft JSON - 在 JArray 中创建 JArray
【发布时间】:2014-08-11 07:54:14
【问题描述】:

我正在尝试使用 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"
}

【问题讨论】:

  • 请在发布问题时更加注意格式化您的代码。我现在已经修复了这个问题,但是在发布之前使用预览来检查您是否没有毫无意义的缩进等。此外,您应该使用参数化 SQL。当然,这不是问题的主题。
  • 你能把它简化为一个简短但完整的程序来演示这个问题吗?摆脱任何不需要的东西,并对您需要的任何数据进行硬编码。我看不出有什么问题,但如果我能自己修补它会容易得多。
  • 感谢您的快速回复和纠正。我刚刚提出了我需要实现的结构和我得到它的代码。但是在添加相同的数组(问题)时,我遇到了错误。我只是想弄清楚我为什么要面对这个?
  • 正如我所说,如果您花一些时间将您当前的代码转换成一个独立的程序来展示同样的失败,我们将更容易找出问题所在,仅使用硬编码数据。哦,告诉我们异常是在哪里引发的。我怀疑它位于surveytrack.Add("questions", questionsA),但我们无法确定。循环开头的surveytrackD 中有什么?例如,这是否已经拥有 questions 属性? (如果是这样,那就可以解释了。)
  • 上面的 json 格式你可以参考硬编码的数据,它是我在 Android 中得到的相同 json 格式,和我在 Windows Phone 中实现的相同。

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


【解决方案1】:

您可以使用常规 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"
      }
    ]
  }
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多