我正在将列表序列化为JSON,我可以通过我的Web服务返回该列表。
List<grabb> timeline = new List<grabb>();
for (int i = 0; i < ds.Tables[0].Rows.Count;i++)
{
grabb thisGrabb = new grabb();
thisGrabb.grabbImage = ds.Tables[0].Rows[i]["graphimage"].ToString();
thisGrabb.grabbURL = ds.Tables[0].Rows[i]["sURL"].ToString();
thisGrabb.grabbText = ds.Tables[0].Rows[i]["quote"].ToString();
thisGrabb.grabbSource = ds.Tables[0].Rows[i]["source"].ToString();
thisGrabb.grabbDomainLink = ds.Tables[0].Rows[i]["domainlink"].ToString();
thisGrabb.grabbCreateDate = ds.Tables[0].Rows[i]["createdate"].ToString();
thisGrabb.grabbPoster = ds.Tables[0].Rows[i]["username"].ToString();
thisGrabb.grabbPosterLink = ds.Tables[0].Rows[i]["userlink"].ToString();
timeline.Add(thisGrabb);
}
string json = JsonConvert.SerializeObject(timeline, Formatting.Indented);
this.Context.Response.ContentType = "application/json; charset=utf-8";
this.Context.Response.Write(json);
但是,虽然这是一个数组,但我不知道如何设置字典名称。我希望它返回类似的东西
[
{ "timeline" :
{
// first list item data in json format
},
{
//next list item data in json format}
}
}
]
而目前它返回:
[
{
// first list item data in json format
},
{
//next list item data in json format}
}
]
我错过了什么?
您正在对列表进行隔离。这将产生一个数组。尝试使用容器类(作为示例中的匿名类):
string json = JsonConvert.SerializeObject(new { timeline = timeline }, Formatting.Indented);
结果将是:
{ "timeline" :
[
{
// first list item data in json format
},
{
//next list item data in json format}
}
]
}
问题中的预期结果不是有效的 JSON。
您不能拥有所描述的结构,因为它不是合法的 JSON:
[ { "timeline" : { item 1 }, { item 2 } } ]
// ^
// Error
所需的结构在:
的另一侧有方括号
{ "timeline" : [ { item 1 }, { item 2 } ] }
// ^^^^^^^^^^^^^^^^^^^^^^^^^^
// Your code already produces this part
您可以通过将列表timeline
添加到string
object
字典来实现此效果。
创建一个匿名对象,如下所示:
var ao = new { timeline: timeline }
string json = JsonConvert.SerializeObject(ao, Formatting.Indented);
<</div>
div class="one_answers"> 您还可以在 Web 服务中设置响应集的名称。假设您有一个简单的请求/响应协定,您可以使用 MessageParameterAttribute 设置响应的名称:
[ServiceContract]
public interface IService
{
...
[OperationContract]
[WebInvoke(Method = "POST",
ResponseFormat = WebMessageFormat.Json,
RequestFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Wrapped)]
[return: MessageParameter(Name = "timeline")]
Entity DoWork(Entity entity);
...
}