2014-11-03 3 views
0

Есть ли способ создать строку массива json из нескольких моделей для Windows 8.1 Store App. Например:Несколько моделей для json

public class Foo 
{ 
    public string property1 {get;set;} 
    public string property2 {get;set;} 
} 

public class Foo2 
{ 
    public string value1 {get;set;} 
    public string value2 {get;set;} 
} 

У меня есть несколько моделей. Я использую json.net для преобразования моделей в строку json. Я также могу преобразовать массивы моделей. Мой вопрос, как я могу создать строку массива JSON, используя эти модели, как:

[ 
    { 
     "property1":"string", 
     "property2":"string" 
    }, 
    { 
     "value1":"string", 
     "value2":"string" 
    }, 
    { 
     "property1":"string", 
     "property2":"string" 
    } 
] 

Я действительно застрял и нужна ваша помощь.

ответ

1

Один из способов сделать это, чтобы создать абстрактный класс BaseFoo, что оба Foo и Foo2 классы будут наследовать:

public abstract class BaseFoo 
{ 

} 

public class Foo : BaseFoo 
{ 
    public string property1 { get; set; } 
    public string property2 { get; set; } 
} 

public class Foo2 : BaseFoo 
{ 
    public string value1 { get; set; } 
    public string value2 { get; set; } 
} 

Допустим, что вы инициализировать список, как это:

var list = new List<BaseFoo> 
    { 
     new Foo 
     { 
      property1 = "prop11", 
      property2 = "prop12" 
     }, 
     new Foo2 
     { 
      value1 = "val1", 
      value2 = "val2" 
     }, 
     new Foo 
     { 
      property1 = "prop21", 
      property2 = "prop22" 
     } 
    }; 

сериализация должна выглядеть так:

var settings = new JsonSerializerSettings 
    { 
     TypeNameHandling = TypeNameHandling.Objects 
    }; 

    var json = JsonConvert.SerializeObject(list, Formatting.Indented, settings); 

И полученный json будет выглядеть следующим образом:

[ 
    { 
     "$type": "ConsoleApplication23.Foo, ConsoleApplication23", 
     "property1": "prop11", 
     "property2": "prop12" 
    }, 
    { 
     "$type": "ConsoleApplication23.Foo2, ConsoleApplication23", 
     "value1": "val1", 
     "value2": "val2" 
    }, 
    { 
     "$type": "ConsoleApplication23.Foo, ConsoleApplication23", 
     "property1": "prop21", 
     "property2": "prop22" 
    } 
] 

Опция TypeNameHandling.Objects добавляются для успешной десериализации:

var deserializedList = JsonConvert.DeserializeObject<List<BaseFoo>>(json, settings); 

Вы можете исключить его и получить точную JSon строку вам нужно, если вы не нужно десериализовать его обратно. Хотя включение в него не должно нарушать функциональность, но увеличит размер json-строки.

+0

Спасибо, я попробую и дам вам информацию о результате. – T3sTR

+0

Спасибо за ответ, это работает для меня! Мне не нужен параметр TypeNameHandling.Objects, потому что мне нужно это для ответа. Спасибо, что ответили снова. – T3sTR

+0

Не можете ли вы просто сделать «Список '? –

Смежные вопросы