2012-03-05 18 views
1

私はモバイルアプリケーションで使用する予定の.netを使用して基本的なWebサービスを作成しました。現在のところ、Jsonは出力していますが、必要な構造ではありません。私はJSONを.NETでシリアライズ

[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"ラッパーが必要な特別な理由はありますか?次のようにシリアル化する匿名オブジェクトを作成できますか?それは冗長なようだ。 –

+0

私はjsonを初めて使う以外の理由はなく、プロパティの各セットにpoiラッパーを明示的に与えることによって、json文字列を配列に戻す方法を見つけ出すことしかできませんでした。私はもっ​​と良い方法があると確信していますが、今はただのものが必要です。 –

答えて

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

+0

これはまさに私が探していたものです。私のアプリは今、完全にjsonの文字列を解析しています、多くのありがとう。 –

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を見た目にしたいものです。あなたはそれを「タイプ」とどのように関連づけていますか?あなたの答えは意図した文字列を返しますか? –

1

ターゲットJSONに不要なオブジェクトIMOが含まれているため、生成されているJSONを使用することをお勧めします。

ターゲット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; } 
} 
関連する問題