簡體   English   中英

在.NET中序列化JSON

[英]Serializing JSON in .NET

我已經使用.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包。

我建議您使用正在生成的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; }
}

使用默認結構,“ poi”唯一給您的就是對象的“類型”,而JSON並沒有這個概念。 如果要包括類型信息,請嘗試:-

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

這將為您提供一個_type_字段,該字段特別有用,如果您具有各種類型的對象的列表。 然后,Json.Net知道如何使用此_type_字段重新創建對象。

無需聲明許多小類即可輸出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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM