在.NET中序列化JSON

时间:2012-03-05 20:55:15

标签: c# .net json

我已经使用.net编写了一个基本的Web服务,我打算在移动应用程序中使用它。它目前输出Json,但结构不是我需要的。

我创建的模型

[DataContract]
class PoiList
{
    [DataMember]
    public List<Poi> Pois { get; set; }
}

[DataContract]
class Poi
{
    [DataMember]
    public string title { get; set; }
    [DataMember]
    public string latitude { get; set; }
    [DataMember]
    public string longitude { get; set; }
}

然后我添加了一些测试数据:

PoiList poiList = new PoiList
    {
        Pois = new List<Poi>()
    };

    Poi p = new Poi
    {
        title = "whatever",
        latitude = "-2.45554",
        longitude = "52.5454645"
    };

    poiList.Pois.Add(p);

    p = new Poi
    {
        title = "weeee",
        latitude = "-2.45554",
        longitude = "52.5454645"
    };

    poiList.Pois.Add(p);

    string ans = JsonConvert.SerializeObject(poiList, Formatting.Indented);

返回的字符串如下所示:

{ "Pois": [ { "title": "shit", "latitude": "-2.45554", "longitude": "52.5454645" }, { "title": "weeee", "latitude": "-2.45554", "longitude": "52.5454645" } ] }

...这就是我希望输出的Json看起来像:

string TempString = @"{ ""pois"":
                        [{ ""poi"": 
                            {
                                ""title"": ""Test title"",  
                                ""latitude"": ""-2.4857856"",
                                ""longitude"": ""54.585656""
                            }},
                        { ""poi"":
                            {
                                ""title"": ""Halfords"",
                                ""latitude"": ""-2.575656"",
                                ""longitude"": ""53.5867856""
                    }}]}";

基本上唯一的区别是列表中每个对象旁边的“poi”。有没有一种简单的方法来包含它?我应该添加我使用newtonsoft.json包。

3 个答案:

答案 0 :(得分:1)

我建议你使用正在生成的JSON,因为你的目标JSON包含不必要的对象,IMO。

您的目标JSON有一个具有单个字段“pois”的对象,其中包含一个对象列表,每个对象都包含一个字段“poi”,其中包含一个对象,其中包含字段“title”,“latitude”和“longitude” ”

要访问单个标题字段,您需要执行以下操作:

poisObj.pois[0].poi.title

如果您使用由对象结构生成的JSON,您将访问单个标题字段,如下所示:

poisObj.pois[0].title

话虽如此,如果您绝对必须以JSON结构为目标,那么您将需要另一个DataContract对象,如下所示:

[DataContract]
class PoiList
{
    [DataMember]
    public List<PoiPoi> Pois { get; set; }
}
[DataContract]
class PoiPoi
{
    [DataMember]
    public Poi poi { get; set; }
}

[DataContract]
class Poi
{
    [DataMember]
    public string title { get; set; }
    [DataMember]
    public string latitude { get; set; }
    [DataMember]
    public string longitude { get; set; }
}

答案 1 :(得分:0)

使用默认结构“poi”给你的唯一东西就是对象的“类型”,JSON实际上并没有这个概念。如果要包含类型信息,请尝试: -

 var jsonSerializerSettings = new JsonSerializerSettings
                {
                    TypeNameHandling = TypeNameHandling.Objects,
                    TypeNameAssemblyFormat = FormatterAssemblyStyle.Full,                
                };
 var json = JsonConvert.SerializeObject(o, Formatting.None, jsonSerializerSettings);

这将为您提供一个字段_type_,如果您有各种类型的对象列表,这将非常有用。然后,Json.Net知道如何使用此_type_字段重新创建对象。

答案 2 :(得分:0)

不需要声明许多小类只是为了输出一个json字符串。您可以创建一个匿名对象来进行序列化,如下所示:

var obj = new { pois = new List<object>() };
obj.pois.Add(new { poi = new {title = "Test title", latitude = "-2.4857856", longitude = "54.585656" } });
obj.pois.Add(new { poi = new {title = "Halfords"  , latitude = "-2.4857856", longitude = "53.5867856" } });

string json = JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.Indented);

Console.WriteLine(json);