Как правильно структурировать вложенные значения JSON? - PullRequest
1 голос
/ 03 марта 2011

У меня есть коллекция значений JSON, которая имеет 3 уровня:

кластер> сегмент> узел

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

Каждый узел содержит идентификатор и ссылку на его идентификатор сегмента и идентификатор кластера.Я написал тестовый объект, подобный этому:

 var customers = [
                     {
                    "cluster" : 
                         {"flights":4, "profit":5245, "clv":2364,
                    "segment" :
                        { "flights":2, "profit":2150, "clv":1564,
                            "node" :
                                    { 'xpos': 1, 'ypos': 2 }// closes node
                        }// closes segment 
                         }//closes cluster
                     },
{
                    "cluster" : 
                         {"flights":4, "profit":5245, "clv":2364,
                    "segment" :
                        { "flights":2, "profit":2150, "clv":1564,
                            "node" :
                                    { 'xpos': 1, 'ypos': 2 }// closes node
                        }// closes segment 
                         }//closes cluster
                     }
];

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

РЕДАКТИРОВАТЬ:

Спасибо за ответы, это определенно указало мне в правильном направлении, насколько инструменты для использования(jsonlint) и получите лучшее понимание структурирования данных в json.Все они правильные ответы, что показывает мне, что это был довольно простой вопрос.Еще раз спасибо.

Ответы [ 5 ]

6 голосов
/ 03 марта 2011

характер json, который у вас есть, совершенно верен (идея объекта, вложенного в объект), если не синтаксически правильный (не проверял, что все ваши запятые были в нужном месте).

однако, у вас нет того, что вы сказали, что хотели, то есть коллекция сегментов в кластере и коллекция узлов в сегменте.

измените его на

[{
  "cluster": {..,
     "segments": [{    <--- note the array -- you now have a collection
         "name": 'segment1', <- optional, just here to show multiple segments
         "nodes": [{....}] <-- same here
     }, 
     {
         "name": 'segment2',
         "nodes": [{....}]
     }]
  }
}]
2 голосов
/ 03 марта 2011

Нет ничего плохого во вложении, однако, если каждый кластер может содержать несколько сегментов, а каждый сегмент может, в свою очередь, иметь несколько узлов, то вам следует использовать массив.

{
    "cluster": {
        "flights": 4,
        ...,
        "segments": [ // segments is an array
            { 
                "flights": 6,
                "nodes": [ // nodes is an array
                    { "xpos": 4, "ypos": 6 },
                    { "xpos": 1, "ypos": 6 },
                    { third node },
                    ...
                ]
            },
            { second segment },
            ...
        ]
    }
}
1 голос
/ 22 мая 2017

Вот усовершенствование логики без потери смысла:

var customers = [
                  {
                    "ID" : "client ABC",
                    "cluster" : { "ID": "cluster 123", "flights": 4, "profit": 5245, "clv": 2364 },
                    "segment" : { "ID": "segment 456", "flights": 2, "profit": 2150, "clv": 1564 },
                    "node" : { "xpos" : 1, "ypos" : 2 }
                  }, {
                    "ID" : "client DEF",
                    "cluster" : { "ID": "cluster 789", "flights": 4, "profit": 5245, "clv": 2364 },
                    "segment" : { "ID": "segment 876", "flights": 2, "profit": 2150, "clv": 1564 },
                    "node" : { "xpos" : 1, "ypos" : 2 }
                  }
];

В приведенном выше фактическом «уровне»:

clusters > flights etc & segments > flights etc & nodes > xpos etc

, что также может быть написано:

level 1: clusters
  level 2: flights, profit, & clv (note: values are unique from segments tho labels are identical)

level 1: segments
  level 2: flights, profit, & clv

level 1: nodes
  level 2: xpos & ypos

Хорошо, давайте согласимся, что пример OP (как изначально написано) может соответствовать строгим механическим требованиям спецификации JSON.

Однако ОП описывает 3 «уровня», иллюстрируя их как кластер> сегмент> узел. Слово «уровень» и стрелки имеют смысл только в том случае, если между этими объектами существует семантическая связь. В конце концов, «уровни» должны относиться друг к другу в иерархии, наследовании, последовательности или каким-либо подобным образом наслоенным образом.

Исходный пример не дает намека на связь между какой-либо частью кластера и любой частью сегмента или любой частью узла; это не дает никакой возможности угадать, какими должны быть отношения. В этом примере метки располагаются рядом друг с другом с несколькими посторонними скобками вокруг них.

Без очевидного отношения к кодированию каждый из этих ключей логически называет уникальное свойство объекта «клиент», то есть каждый клиент имеет кластеры, сегменты и узлы. Каждое свойство четко обозначено, и каждое может счастливо сосуществовать в плоской структуре. Если у ОП есть больше информации об отношениях, которые требуют уровней, структуру легко изменить.

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

1 голос
/ 03 марта 2011

Я думаю, что это выглядит нормально по большей части.Однако обратите внимание на следующее:

  1. JSON key and values should be in double quotes "and not single quotes '. Look at your xpos and ypos`, чтобы понять, что я имею в виду. Обычно я использую JSONLint , чтобы убедиться, что мой JSON действителен.

  2. Вы говорите, что cluster s имеют коллекцию segment s, а segment s имеют коллекцию node sЭто может быть лучше всего представлено в виде массивов.

  3. Выглядит так, будто вам нужно несколько кластеров. Это также лучше всего выражать в виде массива.

Так что-то вроде формы (сильно преувеличено отступ, надеюсь, это поможет):

{
    "cluster" : [
                    {
                        "flights": 4,
                        "profit": 5245,
                        "clv": 2364,
                        "segment" : [
                                        {
                                            "flights": 2,
                                            "profit": 2150,
                                            "clv": 1564,
                                            "node" : [
                                                        {
                                                            "xpos": 1,
                                                            "ypos": 2 
                                                        }, 
                                                        {
                                                            //node 2
                                                        }
                                                    ] 
                                        }, 
                                        {
                                            //segment 2
                                        }
                                    ] 
                    },
                    {
                        //next cluster
                    }
                ]
}
0 голосов
/ 03 марта 2011

Кажется, мне хорошо, хотя по привычке я проверяю все в http://www.jsonlint.com, и проверяется слегка «фиксированная» версия (удалите одиночные кавычки и убедитесь, что вы называете структуру):

{
    "customers": [
        {
            "cluster" : {
                "flights": 4,
                "profit": 5245,
                "clv": 2364,
                "segment" : {
                    "flights": 2,
                    "profit": 2150,
                    "clv": 1564,
                    "node" : {
                        "xpos": 1,
                        "ypos": 2 
                    } 
                } 
            } 
        },
        {
            "cluster" : {
                "flights": 4,
                "profit": 5245,
                "clv": 2364,
                "segment" : {
                    "flights": 2,
                    "profit": 2150,
                    "clv": 1564,
                    "node" : {
                        "xpos": 1,
                        "ypos": 2 
                    } 
                } 
            } 
        } 
    ]
}

В качестве примечания: если бы вы позволили jQuery или другому плагину выполнять 'JSONification', то получилось бы то же самое, как уже отмечалось, вы не представляете сегменты и т. Д. Как коллекцию (здесь Лично я считаю создание объекта более простым представлением).

.. ала (но постройте свой объект):


var stuff = {};
stuff.customers = [];
stuff.customers[stuff.customers.length] = new Cluster();
stuff.customers[i].segment[stuff.customers[i].segment.length] = new Segment();

...etc.
...blah blah fill out object

$.toJSON('{"customerArrary":' + stuff + '}');

function cluster(){
  this.flights;
  this.profit;
  this.clv;
  this.segment = [];
}

function Segment(){
  this.flights;
  this.profit;
  this.clv;
  this.node = [];
}

function Node(){
  this.xpos;
  this.ypos;
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...