Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Обработка json (https://javascript.ru/forum/misc/56643-obrabotka-json.html)

Dark19 26.06.2015 14:09

Обработка json
 
Добрый день, есть ajax запрос:
$.ajax({
                                                                type: "POST",
                                                                url: "http://geotest/ajax.php",
                                                                data: { centerDist:centerDistance,pointDist:pointsDistance },
                                                                success: function(msg){

                                                                }
                                                            });

который посылает некие данные на обработку в php, после обработки они возвращаются вот в таком виде:
{"C":[{"path":["C","C3","C8","C2","C12","C"],"point":[["48.5515","29.5915"],["45.729","29.7453"],["48.0188","31.0637"],["47.6686","32.404"]]},{"path":["C","C11","C"],"point":{"4":["49.3284","31.1077"]}}],
"D":[{"path":["D","D7","D5","D4","D14","D"],"point":[["48.039","38.2796"],["47.1016","35.2604"],["48.6972","35.7438"],["50.0099","37.1602"]]},{"path":["D","D10","D"],"point":{"4":["50.0695","33.7004"]}}],
"A":[{"path":["A","A0","A13","A1","A"],"point":[["51.5378","33.5307"],["50.3561","32.1842"],["50.2153","29.5036"]]}],
"B":[{"path":["B","B9","B6","B"],"point":[["50.8827","25.3508"],["50.039","25.2796"]]}]}


Подскажите как можно вытащить все значения поля "point" ?

tsigel 26.06.2015 14:20

msg.C[1]
или
msg['C'][1]

Dark19 26.06.2015 14:29

Цитата:

Сообщение от tsigel (Сообщение 376667)
msg.C[1]
или
msg['C'][1]

Пишет Uncaught TypeError: Cannot read property '1' of undefined
но там еще проблема в том, что буквы могут быть разными

nerv_ 26.06.2015 14:32

Dark19, что мешает пройтись циклом, если вложенность известна?

рони 26.06.2015 14:39

Dark19,
:blink:
var msg = {
    "C": [{
        "path": ["C", "C3", "C8", "C2", "C12", "C"],
        "point": [
            ["48.5515", "29.5915"],
            ["45.729", "29.7453"],
            ["48.0188", "31.0637"],
            ["47.6686", "32.404"]
        ]
    }, {
        "path": ["C", "C11", "C"],
        "point": {
            "4": ["49.3284", "31.1077"]
        }
    }],
    "D": [{
        "path": ["D", "D7", "D5", "D4", "D14", "D"],
        "point": [
            ["48.039", "38.2796"],
            ["47.1016", "35.2604"],
            ["48.6972", "35.7438"],
            ["50.0099", "37.1602"]
        ]
    }, {
        "path": ["D", "D10", "D"],
        "point": {
            "4": ["50.0695", "33.7004"]
        }
    }],
    "A": [{
        "path": ["A", "A0", "A13", "A1", "A"],
        "point": [
            ["51.5378", "33.5307"],
            ["50.3561", "32.1842"],
            ["50.2153", "29.5036"]
        ]
    }],
    "B": [{
        "path": ["B", "B9", "B6", "B"],
        "point": [
            ["50.8827", "25.3508"],
            ["50.039", "25.2796"]
        ]
    }]
}
 function fn(data)
 {
    Object.keys(data).forEach(function (key) {

	alert(data[key][0]["point"])

});

 }
fn(msg)

Dark19 26.06.2015 14:52

рони,
у меня почему-то пишет undefined и все

рони 26.06.2015 15:04

Dark19,
смотрите что вы получили в msg

Dark19 26.06.2015 15:13

Цитата:

Сообщение от рони (Сообщение 376685)
Dark19,
смотрите что вы получили в msg

Вот:
{"C":[{"path":["C","C3","C8","C2","C12","C"],"point":[["48.5515","29.5915"],["45.729","29.7453"],["48.0188","31.0637"],["47.6686","32.404"]]},{"path":["C","C11","C"],"point":{"4":["49.3284","31.1077"]}}],"D":[{"path":["D","D7","D5","D4","D14","D"],"point":[["48.039","38.2796"],["47.1016","35.2604"],["48.6972","35.7438"],["50.0099","37.1602"]]},{"path":["D","D10","D"],"point":{"4":["50.0695","33.7004"]}}],"A":[{"path":["A","A0","A13","A1","A"],"point":[["51.5378","33.5307"],["50.3561","32.1842"],["50.2153","29.5036"]]}],"B":[{"path":["B","B9","B6","B"],"point":[["50.8827","25.3508"],["50.039","25.2796"]]}]}


больше нет ничего

tsigel 26.06.2015 15:19

Dark19,
может вы забыли распарсить?
JSON.parse(msg)['C'][1];


Читайте $.ajax dataType: 'json'

Dark19 26.06.2015 15:22

рони,
Может я не так пишу что-то?
$.ajax({
                                                                type: "POST",
                                                                url: "http://geotest/ajax.php",
                                                                data: { centerDist:centerDistance,pointDist:pointsDistance },
                                                                success: function(msg){
console.log(msg);

                                                                    function fn(data)
                                                                    {
                                                                        Object.keys(data).forEach(function (key) {
                                                                            console.log(data[key][0]["point"])
                                                                        });
                                                                    }
                                                                    fn(msg);
                                                                }
                                                            });

Dark19 26.06.2015 15:23

Цитата:

Сообщение от tsigel (Сообщение 376689)
Dark19,
может вы забыли распарсить?
JSON.parse(msg)['C'][1];


Читайте $.ajax dataType: 'json'

я не распарсивал, я з ajax-ом ранее дела не имел. Сейчас попробую

рони 26.06.2015 15:40

Цитата:

Сообщение от tsigel
может вы забыли распарсить?
JSON.parse(msg)['C'][1];

зачем парсить и почему 1?

tsigel 26.06.2015 15:43

рони,
ну если консоль все выводит верно, и у msg нет свойств и ключей к которым мы обращаемся, то либо автор что-то напутал, либо msg - строка, нет?

1 потому что C[0] - это 'path', а нужен 'point'

рони 26.06.2015 15:45

:-?
$.ajax({
    dataType: "json",
    type: "POST",
    url: "http://geotest/ajax.php",
    data: {
        centerDist: centerDistance,
        pointDist: pointsDistance
    },
    success: function(msg) {
        console.log(msg);


        Object.keys(msg).forEach(function(key) {
            console.log(msg[key][0]["point"])
        });

    }
});

tsigel 26.06.2015 15:46

рони,
dataType: "json", - у автора не указан.

рони 26.06.2015 15:55

Цитата:

Сообщение от tsigel
dataType: "json", - у автора не указан.

это необязательный параметр - главное чтоб сервер отдавал строку json, а не обьект

Dark19 26.06.2015 16:42

рони,
сделал
msg = JSON.parse(msg);
начало выводить массивы с точками
только не могу понять почему тут data[key][0]["point"] стоит 0 - это подразумевается буква (A,B,C...), типа первый элемент массива? Как можно вывести не массивами, а каждую точку отдельно?

рони 26.06.2015 16:50

Dark19,
data[key] == data["A"] условно -- далее смотрите согласно вашей структуре

nerv_ 26.06.2015 17:05

Цитата:

Сообщение от tsigel
dataType: "json", - у автора не указан.

а еще у него неоднородная структура json =)

Dark19 27.06.2015 11:18

Цитата:

Сообщение от рони (Сообщение 376719)
Dark19,
data[key] == data["A"] условно -- далее смотрите согласно вашей структуре

Перебираю точки вот так:
Object.keys(data).forEach(function (key) {
                                                                            var p = 0, x = 0;
                                                                            for(p=0;p<data[key].length;p++){
                                                                                console.log(data[key][p]['point']);
                                                                                for(x;x<data[key][p]['point'].length;x++){
                                                                                    console.log(data[key][p]['point'][x]);
                                                                                }
                                                                            }
                                                                        });

выводит нормально, но вот там где в массиве только один элемент не выводит ничего. Что не так делаю?

nerv_ 27.06.2015 12:32

как вариант http://jsfiddle.net/41qp5hua/

Dark19 27.06.2015 13:13

Цитата:

Сообщение от nerv_ (Сообщение 376781)
как вариант http://jsfiddle.net/41qp5hua/

забыл показать обьект, что приходит сейчас, я немного поменял код
{

"C":[{"path":["C","C3","C8","C2","C12","C"],"point":[["48.5515","29.5915"],["45.729","29.7453"],["48.0188","31.0637"],["47.6686","32.404"]],"pointCenter":[["48.4931","32.2721"]]},{"path":["C","C11","C"],"point":[["49.3284","31.1077"]],"pointCenter":[["48.4931","32.2721"]]}],

"D":[{"path":["D","D7","D5","D4","D14","D"],"point":[["48.039","38.2796"],["47.1016","35.2604"],["48.6972","35.7438"],["50.0099","37.1602"]],"pointCenter":[["49.5623","34.5573"]]},{"path":["D","D10","D"],"point":[["50.0695","33.7004"]],"pointCenter":[["49.5623","34.5573"]]}],

"A":[{"path":["A","A0","A13","A1","A"],"point":[["51.5378","33.5307"],["50.3561","32.1842"],["50.2153","29.5036"]],"pointCenter":[["50.4404","30.5582"]]}],

"B":[{"path":["B","B9","B6","B"],"point":[["50.8827","25.3508"],["50.039","25.2796"]],"pointCenter":[["49.3905","27.0426"]]}]

}


а почему мой цикл не выводит там где только один элемент в массиве, ведь его длина =1, а цикл начинает считать с 0?

рони 27.06.2015 13:33

Dark19,
<script>
 var msg = {

    "C": [{
        "path": ["C", "C3", "C8", "C2", "C12", "C"],
        "point": [
            ["48.5515", "29.5915"],
            ["45.729", "29.7453"],
            ["48.0188", "31.0637"],
            ["47.6686", "32.404"]
        ],
        "pointCenter": [
            ["48.4931", "32.2721"]
        ]
    }, {
        "path": ["C", "C11", "C"],
        "point": [
            ["49.3284", "31.1077"]
        ],
        "pointCenter": [
            ["48.4931", "32.2721"]
        ]
    }],

    "D": [{
        "path": ["D", "D7", "D5", "D4", "D14", "D"],
        "point": [
            ["48.039", "38.2796"],
            ["47.1016", "35.2604"],
            ["48.6972", "35.7438"],
            ["50.0099", "37.1602"]
        ],
        "pointCenter": [
            ["49.5623", "34.5573"]
        ]
    }, {
        "path": ["D", "D10", "D"],
        "point": [
            ["50.0695", "33.7004"]
        ],
        "pointCenter": [
            ["49.5623", "34.5573"]
        ]
    }],

    "A": [{
        "path": ["A", "A0", "A13", "A1", "A"],
        "point": [
            ["51.5378", "33.5307"],
            ["50.3561", "32.1842"],
            ["50.2153", "29.5036"]
        ],
        "pointCenter": [
            ["50.4404", "30.5582"]
        ]
    }],

    "B": [{
        "path": ["B", "B9", "B6", "B"],
        "point": [
            ["50.8827", "25.3508"],
            ["50.039", "25.2796"]
        ],
        "pointCenter": [
            ["49.3905", "27.0426"]
        ]
    }]

}
 function fn(data)
 {
    Object.keys(data).forEach(function (key) {

	data[key].forEach(function(el,i) {
                  document.write(key + " " + i + " " +JSON.stringify(el["point"])+ "<br>")
})

})};


fn(msg)



 </script>

nerv_ 27.06.2015 14:06

Цитата:

Сообщение от Dark19
забыл показать обьект, что приходит сейчас, я немного поменял код

Если ты управляешь структурой json в чем проблема вообще? :)

рони 27.06.2015 14:08

Цитата:

Сообщение от nerv_
Если ты управляешь структурой json в чем проблема вообще?

:yes: -- пусть сервер присылает нужный результат

Dark19 27.06.2015 14:08

Цитата:

Сообщение от nerv_ (Сообщение 376790)
Если ты управляешь структурой json в чем проблема вообще? :)

js плохо знаю(

Dark19 27.06.2015 14:18

рони,
спасибо, работает отлично. А есть возможность прокручивать элементы массива внутри свойств функции?
Например есть функция вывода точек на карту ymaps.route к ней в свойства передаются элементы из массива. Первая точка и последняя статические(их нужно вывести один раз при обходе каждого массива), а вот промежуточные точки type: 'viaPoint' нужно вывести все из массива. То есть результат должен получится такой: начальная точка el['pointCenter'][0] потом вывод всех точек из массива C->0 потом конечная точка el['pointCenter'][0], el['pointCenter'][0] потом вывод всех точек из массива C->1 потом конечная точка el['pointCenter'][0], el['pointCenter'][0] потом вывод всех точек из массива D->0 потом конечная точка el['pointCenter'][0] и т.д. Можно ли такое сделать и как?


Вот код:
function fn(data)
                                                                    {
                                                                        Object.keys(data).forEach(function (key) {
                                                                            var p = 0, x = 0;
                                                                            data[key].forEach(function(el,i) {
                                                                                console.log(el["point"]);
                                                                                for(p=0;p<el['point'].length;p++){

                                                                                    ymaps.route([
                                                                                            el['pointCenter'][0],
                                                                                            {
                                                                                                type: 'viaPoint',
                                                                                                point: el['point'][p]
                                                                                            },
                                                                                            el['pointCenter'][0]
                                                                                        ]).then(
                                                                                        function (route) {
                                                                                            myMap.geoObjects.add(route);
                                                                                        },
                                                                                        function (error) {
                                                                                            alert("Возникла ошибка: " + error.message);
                                                                                        }
                                                                                    );
                                                                                }
                                                                            });
                                                                        });
                                                                    }
                                                                    fn(msg);

рони 27.06.2015 15:10

Цитата:

Сообщение от Dark19
Можно ли такое сделать и как?

вы уже получали ответ ранее, да можно но помочь вам ничем не могу.


Часовой пояс GMT +3, время: 19:12.