多个嵌套的JSON信息-C#流程

时间:2019-01-30 11:30:47

标签: c# arrays json unity3d

很抱歉,如果我做错了什么,这是我的第一篇帖子。

目前,我正在用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#类吗?

2 个答案:

答案 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)