json.net 如何设置 JSON 字典键名称



我正在将列表序列化为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);
    ...
}

相关内容

  • 没有找到相关文章

最新更新