从webservice返回单个json对象的数组

时间:2015-01-08 16:40:30

标签: javascript json vb.net web-services

我从网络服务中检索json并使用$ .each()遍历层次结构。我遇到的问题是"标题",可能有一个标题或多个标题。我该如何强制使用"标题"返回一个对象数组,即使集合中只有一个对象,所以$ .each()也不会爆炸。

'VB Webservice...
ds.DataSetName = "dsSurveys"
ds.Tables(0).TableName = "Surveys"
ds.Tables(1).TableName = "Titles"
ds.Tables(2).TableName = "Questions"
ds.Tables(3).TableName = "ResponseTypes"

Dim relSurveyTitles As New DataRelation("relSurveyTitles", ds.Tables("Surveys").Columns("SurveyId"), ds.Tables("Titles").Columns("SurveyId"))
Dim relTitlesQuestions As New DataRelation("relTitlesQuestions", ds.Tables("Titles").Columns("TitleId"), ds.Tables("Questions").Columns("TitleId"))
Dim relResponseTypesQuestions As New DataRelation("relResponseTypesQuestions", ds.Tables("ResponseTypes").Columns("ResponseTypeId"), ds.Tables("Questions").Columns("ResponseTypeId"))

relSurveyTitles.Nested = True
relTitlesQuestions.Nested = True
relResponseTypesQuestions.Nested = False

ds.Relations.Add(relSurveyTitles)
ds.Relations.Add(relTitlesQuestions)
ds.Relations.Add(relResponseTypesQuestions)

Dim doc As New XmlDocument()
doc.LoadXml(ds.GetXml())
Dim jsonText As String = JsonConvert.SerializeXmlNode(doc).Replace("null", """""").Replace("'", "'")
Return jsonText
//json response
{
    "dsSurveys": {
        "Surveys": {
            "SurveyId": "1",
            "SurveyName": "Survey 1",
            "Titles": {     //I would like to see this in an array (like "Questions") --> "Titles": [{
                             //regarless of object count
                "SurveyId": "1",
                "TitleId": "1",
                "TitleName": "Title 1",
                "Questions": [{
                    "SurveyId": "1",
                    "TitleId": "1",
                    "QuestionId": "1",
                    "Question": "Question 1?",
                    "isComment": "true",
                    "ResponseTypeId": "1"
                },
                {
                    "SurveyId": "1",
                    "TitleId": "1",
                    "QuestionId": "2",
                    "Question": "Question 2?",
                    "isComment": "true",
                    "ResponseTypeId": "1"
                }]
            }
        },
        "ResponseTypes": {
            "ResponseTypeId": "1",
            "ResponseType": "Yes|No|N/A"
        }
    }
}

1 个答案:

答案 0 :(得分:1)

通过添加Titles属性(json命名空间),您可以强制json:Array='true'强制http://james.newtonking.com/projects/json序列化为数组,即使只有一次出现也是如此。是<Titles>节点的Dim doc As New XmlDocument() doc.LoadXml(ds.GetXml()) ' Add the namespace declaration to the root node Dim nsAttr = doc.CreateAttribute("xmlns", "json", "http://www.w3.org/2000/xmlns/") nsAttr.Value = "http://james.newtonking.com/projects/json" doc.DocumentElement.Attributes.Append(nsAttr) ' Add the json:Array attribute to each Titles element For Each title As XmlElement In doc.SelectNodes("//Titles") Dim attr = doc.CreateAttribute("json:Array", "http://james.newtonking.com/projects/json") attr.Value = "true" title.Attributes.Append(attr) Next Dim jsonText As String = JsonConvert.SerializeXmlNode(doc).Replace("null", """""").Replace("'", "'") Return jsonText

您可以使用以下内容添加适当的属性:

{{1}}