json.net c# - 如何设置json字典的键名?

时间:2017-01-27 11:25:23

标签: c# json json.net

我将列表序列化为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}
    }
]

我错过了什么?

4 个答案:

答案 0 :(得分:4)

您正在查询列表。这将导致一个数组。尝试使用容器类(在示例中作为匿名类):

%20

结果将是:

string json = JsonConvert.SerializeObject(new { timeline = timeline }, Formatting.Indented);

您问题中的所需结果无效JSON。

答案 1 :(得分:2)

您不能拥有您描述的结构,因为它不是合法的JSON:

[ { "timeline" : { item 1 }, { item 2 } } ]
//                         ^
//                       Error

您想要的结构在:

的另一侧有方括号
{ "timeline" : [ { item 1 }, { item 2 } ] }
//             ^^^^^^^^^^^^^^^^^^^^^^^^^^
//         Your code already produces this part

您可以通过将timeline列表添加到stringobject词典来实现此效果。

答案 2 :(得分:1)

你可以像这样创建一个匿名对象:

var ao = new { timeline: timeline }
string json = JsonConvert.SerializeObject(ao, Formatting.Indented);

答案 3 :(得分:1)

您还可以在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);
    ...
}