Множественная вложенная информация JSON - процесс C # - PullRequest
0 голосов
/ 30 января 2019

извиняюсь, если я делаю что-то не так, это мой первый пост.

В настоящее время я работаю с 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
              }
         }
    }

Мне бы очень хотелось иметь возможность вызывать информацию с определенным набором идентификаторов, например 001-02-01который будет возвращать строку («бла-бла-бла») и int (2241).

Причина, по которой я хочу использовать это вместо того, чтобы иметь один более длинный идентификатор, заключается в том, что когда файл JSONстановится очень большим, я надеюсь, что смогу ускорить поиск информации, передавая каждый идентификатор по очереди.

Если это не имеет смысла, и было бы одинаково быстро просто передать один более длинный идентификатори не беспокойтесь по поводу всей этой концепции вложенных сегментов идентификаторов, тогда, пожалуйста, дайте мне знать!

Если, однако, то, что я думаю, правильно, и это поможет скорости нахождения определенных данных, структурируя их какs, как бы я поступил так?С вложенными классами C # в массивах?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Если вы в конечном итоге сохраните миллионы записей в своем файле и захотите начать делать что-то более производительное, было бы проще переключиться на приличную базу данных документов, такую ​​как 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)
0 голосов
/ 30 января 2019

Самый простой и эффективный способ - все данные одного типа.В настоящее время вы, похоже, подходите к каждому объекту, имеющему тип с указанным идентификатором:

{
   "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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...