很抱歉,如果我做错了什么,这是我的第一篇帖子。
目前,我正在用C#工作,并要保存一组数据出来一个JSON文件并加载它回来,但我无法搞清楚如何得到它的格式如下:
// Primary ID
001
{
// Secondary ID
01
{
// Tertiary ID
01
{
string: "this is some information.",
int: 9371
}
}
// Secondary ID
02
{
// Tertiary ID
01
{
string: "blah blah blah.",
int: 2241
}
}
}
我基本上希望能够调用信息与特定集ID例如001-02-01这将返回字符串的(“等等等等等等。”)和int(2241)。>
我想之所以会去做这样的,而不是仅仅有一个较长的ID是这样,当JSON文件变得非常大,我希望能够通过传递每个ID在加快对信息的搜索转。
如果这没有任何意义,只是传递一个更长的ID而不会被整个嵌套的ID细分概念所困扰,那么请让我知道!
但是,如果我想的是正确的,并且通过这样的结构化结构可以帮助找到特定数据的速度提高,我该怎么做呢?数组中有嵌套的C#类吗?
答案 0 :(得分:1)
最简单有效的方法是将所有数据都设为相同类型。当前,您似乎希望每个对象都是给定id的类型:
{
"01":{},
"02" :{}
}
如果尝试使用可序列化的类,这不会太好。
我建议以下内容:
{
"items" : [
{"id":"01" }, { "id":"02" },...
]
}
然后,您可以轻松地使用序列化/反序列化
[Serializable]
public class Item
{
public string id = null;
}
[Serializable]
public class RootObject
{
public List<Item> items = null;
}
,然后在Unity中:
void Start(){
string str = GetJson(); // However you get it
RootObject ro = JsonUtility.FromJson<RootObject>(str);
}
如果您想加快获取速度,并且您的收藏很大,请转换为字典。
Dictionary<string, Item> dict = null;
void Start(){
string str = GetJson(); // However you get it
RootObject ro = JsonUtility.FromJson<RootObject>(str);
this.dict = new Dictionary<string,Item>();
foreach(Item item in ro.items){
Item temp = temp;
this.dict.Add(item.Id, temp);
}
ro = null;
}
现在,您可以快速访问真实内容。
Item GetItem(string id)
{
if(string.IsNullOrEmpty(id) == true){ return null; }
Item item = null;
this.dict.TryGetValue(id, out item);
return item;
}
答案 1 :(得分:0)
如果您最终在文件中存储了数百万条记录,并且想要开始执行更高性能的工作,那么切换到像MongoDB这样的体面的文档数据库将比尝试重新发明轮子更容易。
在担心尚不存在性能问题之前,担心编写好的标准代码。
以下示例不是您所选择的语言,但它确实说明可以非常快速地搜索JSON和1,000,000个对象的数组:
const getIncidentId = () => {
let id = Math.random().toString(36).substr(2, 6).toUpperCase().replace("O", "0")
return `${id.slice(0, 3)}-${id.slice(3)}`
}
console.log("Building array of 1,000,000 objects")
const littleData = Array.from({ length: 1000000 }, (v, k) => k + 1).map(x => ({ cells: { Number: x, Id: getIncidentId() } }))
console.log("Getting list of random Ids for array members [49, 60, 70000, 700000, 999999]")
const randomIds = ([49, 60, 70000, 700000, 999999]).map(i => littleData[i].cells.Id)
console.log(randomIds)
console.log("Finding each array item that contains a nested Id property in the randomIds list.")
const foundItems = littleData.filter(i => randomIds.includes(i.cells.Id))
console.log(foundItems)