2012-03-05 63 views
1

我已經使用.net編寫了基本Web服務,我打算在移動應用程序中使用它。它目前輸出Json,但結構不是我所需要的。在.NET中序列化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軟件包。

+2

是否有一個特定的原因,您需要額外的「poi」包裝?看起來多餘。 – 2012-03-05 20:59:19

+0

沒有任何理由,除了我是使用json的新手之外,我只能弄清楚如何通過明確地給每個屬性集合一個poi包裝來將json字符串解析回數組。我確信有更好的方法,但現在我只需要一些可行的方法。 – 2012-03-05 22:35:52

回答

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); 
+0

可能有正當理由使用命名類服務器端。 – Randolpho 2012-03-05 22:30:39

+0

這正是我所期待的;我的應用程序現在完全解析json字符串,非常感謝。 – 2012-03-05 22:32:31

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_字段重新創建對象。

+0

問題:「這就是我想要輸出的Json看起來像'。你如何將它與「類型」聯繫起來?你的答案是否返回預期的字符串? – 2012-03-05 22:10:50

1

我建議你去使用正在生成的JSON,因爲你的目標JSON包含不必要的對象IMO。

您的目標JSON有一個單個字段「pois」的對象,其中包含一個對象列表,每個對象包含一個字段爲「title」,「latitude」和「經度」。

要訪問一個標題字段,你需要做到以下幾點:

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; } 
}