关于S.O的第一个问题,以及目前的新手。
我现在正试图为一个游戏从一个对象创建一个Json文件。这是我要写入文件的主要对象:(类"块"one_answers"项目"是iLists,正如你可能知道的那样)
public string title { get; set; }
public string type { get; set; }
public string map { get; set; }
public string mode { get; set; }
public string champion { get; set; }
public int sortrank { get; set; }
public bool isGlobalForChampions { get; set; }
public bool isGlobalForMaps { get; set; }
public bool priority { get; set; }
public IList<Block> blocks { get; set; }
public IList<object> associatedChampions { get; set; }
public IList<object> associatedMaps { get; set; }
public ItemSet(string _title, string _type, string _map, string _mode, string _champion, int _sortrank, bool _isGlobalForChampions, bool _isGlobalForMaps, bool _priority, IList<Block> _blocks, IList<object> _associatedChampions, IList<object> _associatedMaps)
{
title = _title;
type = _type;
map = _map;
mode = _mode;
champion = _champion;
sortrank = _sortrank;
isGlobalForChampions = _isGlobalForChampions;
isGlobalForMaps = _isGlobalForMaps;
priority = _priority;
blocks = _blocks;
associatedChampions = _associatedChampions;
associatedMaps = _associatedMaps;
}
public class Block
{
public IList<Item> items { get; set; }
public string type { get; set; }
}
public class Item
{
public int count { get; set; }
public string id { get; set; }
}
但我有一种明显的感觉,我在这件事上的做法都是错误的。实际上,我使用了Json到C#生成器来发现(在多次手动尝试失败后),让我了解可能需要考虑使用的变量类型。但我一辈子都搞不清初始化iList<>的语法有了构造函数,再多糟糕的谷歌搜索也不会让我更接近这个答案。
当前初始化:(显然缺少最后3个参数)
ItemSet itemSetTest = new ItemSet("TEST_ITEM_SET", "custom", "any", "", "Kalista", 0, false, true, false, );
如果我没有提供足够/正确的信息,请不要犹豫,直言不讳!
次要事项:我想我会像添加其他数组一样添加到列表中吗?这样做是不是很糟糕?
删除您拥有的构造函数,您不需要它。
itemSet = new ItemSet {
title="...",
...,
blocks=new List<Blocks>() {
new Block {
type="...",
items=new List<Item>() {
new Item { count=..., id=...},
new Item { count=..., id=...}
}
},
new Block {
type="...",
items=new List<Item>() {
new Item { count=..., id=...},
new Item { count=..., id=...}
}
}
}
};
这就是前进的道路-
new List<Item> () {
new Item(),
new Item(),
new Item(),
new Item()
};
祝好运
回答您关于如何实例化类的问题;您需要将新的List项传递给构造函数。例如:
//add items to these lists and change names if needs be.
var blocks = new List<Block>();
var champs = new List<Object>();
var maps = new List<Object>();
var itemSetTest = new ItemSet("TEST_ITEM_SET", "custom", "any", "", "Kalista", 0, false, true, false, blocks, champs, maps);
从本质上讲,List实现了IList。IList是一个接口,因此无法实例化。但是因为List实现了IList,所以您可以将List传递给构造函数,它就会接受它
我希望这能回答你的问题。
我还想提一下,你的构造函数非常大(哦,matron)。您可能需要考虑创建更多的类并组合这些属性。您还可以考虑为其中一些属性设置默认值;例如,如果字符串冠军通常是"bob",则可以将其设置为默认值,并且只有在名称不同时才将冠军字符串传递给构造函数。
我还假设您的ItemSet类(也许想一个更有意义的名称)实际上是一个类,而您只是复制了一些包装代码块?
更新1
当你说要组合属性时,你的意思是使用遗产
不完全是,但也许我用词不当。我的意思是将相关属性分组到它们自己的类中。让我们举一个简单的例子或一个Person类:
public class Person
{
public string Name { get; set; }
public string Postcode { get; set; }
public string Town { get; set; }
public string Country { get; set; }
public string TwitterUrl { get; set; }
public string FacebookUrl { get; set; }
public string GooglePlusUrl { get; set; }
public Person(string name, string postcode, string town, string country, string twitterurl, string facebookurl, string googleplusurl)
{
Name = name;
Postcode = postcode;
Town = town;
Country = country;
TwitterUrl = twitterurl;
FacebookUrl = facebookurl;
GooglePlusUrl = googleplusurl;
}
}
创建Person类型的实例会有点乏味,很难阅读,也很难维护:
var person = new Person("Some name", "some postcode", "some town", "some country", "some twitter url", "some fb url", "some g+ url");
让我们通过将相关属性分组到它们自己的类来简化它:
public class Person
{
public string Name { get; set; }
public Address Address { get; set; }
public SocialMedia SocialMedia { get; set; }
public Person(string name, Address address, SocialMedia socialmedia)
{
Name = name;
Address = address;
SocialMedia = socialmedia;
}
}
public class Address
{
public string Postcode { get; set; }
public string Town { get; set; }
public string Country { get; set; }
}
public class SocialMedia
{
public string TwitterUrl { get; set; }
public string FacebookUrl { get; set; }
public string GooglePlusUrl { get; set; }
}
现在我们的Person只有属性,你可以立即看到发生了什么。我们已经将构造函数的大小减少到一个更易于管理的状态:
var address = new Address() { ... };
var socialmedia = new SocialMedia() { ... };
var person = new Person("Some name", address, socialmedia);
对我来说,这更可读。您的地址&SocialMedia模型也可以在应用程序的其他地方重复使用。
我一直在想如何序列化多个对象(json.net)转移到同一个文件,但在大约一周的时间里没有任何运气,并且决定尽量把所有的东西都放在一个班里。
Newtonsoft的json.net(http://www.newtonsoft.com/json)?如果没有,那么我建议你使用这个库,因为它已经成为标准。
要序列化我们声明的person
,您需要使用json.net提供的以下方法:
//...
var person = new Person("Some name", address, socialmedia);
string personJsonified = JsonConvert.SerializeObject(person);
这将生成我们人员的json字符串。
但是,您需要多个对象。如果你想要多个Person对象,你可以创建一个列表并序列化它:
var person1 = new Person("Jim", address, socialmedia);
var person2 = new Person("Bob", address, socialmedia);
var people = new List<Person> { person1, person2 };
string peopleJsonified = JsonConvert.SerializeObject(people);
如果您希望在json字符串中返回多个类型,例如Person和Car(我们创建的一个虚构类),则需要将它们封装在其他类中:
var myPerson = new Person("Jim", address, socialmedia);
var myCar = new Car();
var randomObjects = new SomeRandomObjects{ Person = myPerson, Car = myCar };
string randomObjectsJsonified = JsonConvert.SerializeObject(randomObjects);
希望您将能够从中生成json文件。
还有什么命名惯例提示吗?
至于命名约定和指南,请参阅MSDN开发类库的设计指南