2012-03-05 4 views
1

Я написал базовый веб-сервис с использованием .net, который я намерен использовать в мобильном приложении. В настоящее время он выводит 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"" 
        }}]}"; 

В основном единственная разница - это «пои» рядом с каждым объектом в списке. Есть ли простой способ включить это? Я должен добавить, что я использую пакет newtonsoft.json.

+2

Есть ли конкретная причина, по которой вам нужна эта дополнительная «poi» обертка? Это кажется излишним. –

+0

Нет причин, кроме того, что я новичок в использовании json, и я мог только выяснить, как разбирать json-строку обратно в массив, явно предоставляя оболочку poi для каждого набора свойств. Я уверен, что есть лучший способ, но сейчас мне просто нужно что-то, что работает. –

ответ

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, поскольку ваша цель JSON содержит ненужные объекты IMO.

У вашей целевой JSON есть объект с одним полем «pois», который содержит список объектов, каждый из которых содержит одно поле «poi», которое содержит объект с полями «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; } 
} 
Смежные вопросы