Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Ошибка в JSON

MP3-сайт
суть в следующем: есть страничка со стилями (муз. жанрами).
В самом низу скинул скриншот
прокрутив страницу до низа есть кнопка "Ещё песни".
Нажимаешь на неё - должно появляться ещё 10 песен текущего жанра (стиля), например жанр шансон, клубляк, медляки и тд.

есть js-скрипт который передаёт данные в php-обработчик

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<script>
    $(document).ready(function(){
        var inProcess = false;
        var num = 10;       // количество загружаемых песен по нажатию на кнопку
        var id = <?= $id ?>;   // id - это стиль      
 
        $("#load").click(function(){    // нажимаем на кнопку
                $.ajax({
                    url: 'content.php',   // аяксом загружаем php обработчик 
                    method: 'GET',
                    data: {
                        'id' : id,              // передаём id 
                        'num' : num},     // передаём кол-во подгружаемых песен.
                    beforeSend: function(){
                        inProcess = true;
                    }
                }).done(function(data){
                    data = jQuery.parseJSON(data);
 
                    if (data.length > 0){
                        $.each(data, function(index, data){
                            ...         // здесь идёт вывод в html и оформление в css 
                        });
                        inProcess = false;
                        num += 10;
                    }
                });
        });
    });
</script>  
это был js-скрипт.

дальше - php обработчик
Комментарии по ходу кода:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
if(isset($_GET['id'])){$id = (int)$_GET['id'];} if(!isset($id)){$id = 1;} // id - в данном случае это музыкальный стиль (жанр) - попса, клубняк, медляки, шансон и тд.
$num = $_GET['num']; // num - количество выводимых песен 
 
if(isset($_GET['id'])){
    echo "1. Page with Styles "; // для дебага - если в ссылке есть параметр id (ссылка типа site.ru/index.php?id=1), делаем следующую выборку
$result2 = mysql_query("
SELECT song_add.id, artist_id, song, size, time, bitrate, song_add.title, style_id 
FROM song_add 
INNER JOIN style
ON song_add.style_id = style.id
WHERE style.id='".(int)$id."'
ORDER BY song_add.id
DESC LIMIT ".(int)$num.", 10", $db);
if (!$result2){echo mysql_error(); exit();}
$songs2 = array();
 
while($row2 = mysql_fetch_array($result2)){
    $songs2[] = $row2;
}
echo json_encode($songs2);
}
 
else{    // если любая другая страница, делаем другую выборку - уже без стиля.
    echo "2. Main page - m.new.php ";
    $result3 = mysql_query("
SELECT id, artist_id, song, size, time, bitrate, title 
FROM song_add 
ORDER BY song_add.id
DESC LIMIT ".(int)$num.", 10", $db);
if (!$result3){echo mysql_error(); exit();}
$songs3 = array();
 
while($row3 = mysql_fetch_array($result3)){
    $songs3[] = $row3;
}
echo json_encode($songs3);
}
ПРОБЛЕМА: при нажатии на кнопку "Ещё песни" firebug выдаёт ошибку: SyntaxError: JSON.parse: unterminated fractional number at line 1 column 3 of the JSON data.
Если смотреть в консоли - данные приходят, всё ок, массив кодированный JSON отображается.
но изза ошибки SyntaxError: JSON.parse: в html на самой странице ничего не происходит

Если же в php обработчике убрать условие if else - и оставить к примеру первое - кнопка "Ещё песни" срабатывает только на странице со стилями.
Если оставить вторую часть - срабатывает там, где нет параметра id (т.е. на всех остальных страницах, в частности на главной)
Как убрать эту ошибку? SyntaxError: JSON.parse:

Скриншот для наглядности
Ответ: Решил.
оказывается в условии if else нужно было убрать echo "1. Page with Styles "; - JSON выдавал ошибку. убрал эхо и сразу заработало ))
Вопрос: Как убрать экранирование в ответе JSON

Здравствуйте коллеги.
Получаю из базы контент с html тегали.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 $sql = $mysqli->query("SELECT chanel_title, 
                                        title,
                                        content,
                                        link, 
                                        img, 
                                        date_publication
                                  FROM RSS_DATA WHERE status = '1'
                                  ORDER BY `date_publication` DESC
                                  LIMIT ".$offset.",".$pagesize.";");
             $result = $sql;
 
         if ($result->num_rows > 0) {
            
           $responseJSON["error"] = FALSE;
           $responseJSON["error_msg"] = "Новости загружены";
 
            // output data of each row
           while($row = mysqli_fetch_assoc($result)) {
 
               $responseJSON['news'][] = $row;
 
              } 
 
           // Конкретизируем что это именно формат JSON а не простой текст или HTML и т.д.
            header('Content-type: application/json');
            print_r (json_encode($responseJSON, JSON_HEX_TAG));    
Проблема в том что в ответе получаю экранирование ссылок на картинки или видео в контенте из-за которых контент полностью не подгружается(cкопировав полученный контент со сохранив его в формате html). Отображается только текст контента с тегами форматирования текста.
Как получить от сервера контент без экранирования для корректного отображения html страницы?

JSON
1
              <html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>Мечеть Саранска переполнена желающими получить обещанное (видео)</title></head><body><img src="http://ansar.ru/uploads/imagesb/2016/06/0ad8b410.jpg" width="620" alt=""><h1 class="post-title">Мечеть Саранска переполнена желающими получить обещанное (видео)</h1><p>Священный для мусульман месяц Рамадан вступил в свою финальную часть. Мусульмане всего мира с радостью, надеждой и ещё большей энергией устремились в мечети – дома Аллаха, чтобы получить обещанное прощение грехов и награду от Всевышнего.</p></body>              
Ответ:
Сообщение от A_R_S
Как декодировать и чем?
Смотря где. На сервере в php json_decode. На клиенте js JSON.parse
Вопрос: Вопрос по использованию JSON-RPC на Perl (на iptvportal.ru)

Есть система (IPTV Portal), предоставляющая API в виде JSON-SQL (JSON-RPC, манипулирующий SQL-запросами).
Использую такой код:
#!/usr/bin/perl -w

use strict;
use warnings;

use JSON::RPC::Client;
use Data::Dumper;

my $api = new JSON::RPC::Client;
my $domain = 'xxx';
my $username = 'xxx';
my $password = 'xxx';
my $url = "https://admin.$domain.iptvportal.ru/api/jsonsql";

$api->version('2.0');
$api->ua()->ssl_opts(verify_hostname=>0);
$api->prepare($url, ['authorize_user','select','insert','update','delete']);

$api->id(1);
$api->authorize_user( {username=>$username, password=>$password} );

На последней строке получаю такую ошибку:
malformed JSON string, neither array, object, number, string or atom, at character offset 0 (before "<!DOCTYPE HTML PUBLI...") at /usr/lib/perl5/site_perl/5.14.2/JSON/RPC/Client.pm line 186.

Есть предположения, почему я получаю ошибку?

________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
Ответ: Такой вопрос.

В JSON-RPC можно работать в , в этом случае вместо объекта я передаю массив объектов:
[
        {"jsonrpc": "2.0", "method": "sum", "params": [1,2,4], "id": "1"},
        {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]},
        {"jsonrpc": "2.0", "method": "subtract", "params": [42,23], "id": "2"},
        {"foo": "boo"},
        {"jsonrpc": "2.0", "method": "foo.get", "params": {"name": "myself"}, "id": "5"},
        {"jsonrpc": "2.0", "method": "get_data", "id": "9"} 
    ]

и получаю, соответственно, массив ответов.
Однако в JSON::RPC::Client при попытке передать массив я получаю ошибку "not hashref.".
Судя по исходному коду JSON::RPC::Client работа в пакетном режиме в нем не предусмотрена:
    my ($self, $uri, $obj) = @_;
    my $result;

    if ($uri =~ /\?/) {
       $result = $self->_get($uri);
    }
    else {
        Carp::croak "not hashref." unless (ref $obj eq 'HASH');
        $result = $self->_post($uri, $obj);
    }


Не посоветуете библиотеку для работы с JSON-RPC?
Или тут придется писать свой код?
Вопрос: Клиент послал JSON севрер перевёл его в Model

Модель:
public class Table1
{
   public int Table1Id { get; set; }
   public string Name { get; set; }
   public virtual IList<Table2> table2 { get; set; }

   public string Table2JSON { get; set; } //для получения JSON  в текстовом формате для Table2, чисто для проверки что пришло
}
public class Table2
{
   public int? Table2Id { get; set; }
   public string Table2Name { get; set; }
}


Клиент посылает JSON.
WebApi PUT-метод (UPDATE) - принимает JSON:
public async Task<IHttpActionResult> PutTable1(int id, Table1 table1)
{
   //получаю корректно все поля модели "Table1"
   //А вот с моделью "Table2" проблема - записей нет (значение полей == null).

   //JSON для "Table2": 
   //[{"Table2Name":"Name-1","Table2Id":1},{"Table2Name":"Name-2","Table2Id":2}]
}


Если отсылаю дополнительный параметр для "table2", то появляется одна запись table2[0] с значениями полей == null
Если не отсылаю, то запись "table2" вообще не появляется, то есть table2 == null

Что-то не так с JSON для "Table2".

Может кто увидит ошибку ...
Ответ:
e24
Так, в том то и прикол, что "черти чо" (Table1) нормально принимает


плоская модель потому что. вложенные модели в x-www-form-urlencoded не поддерживаются. это азы веба, не надо катить бочку на WebAPI, ведь тут никаким JSON-ом не пахнет.

код клиента надо допиливать, чтобы енкодил в JSON (JSON.stringify) и отправлял с правильным заголовком.
Вопрос: Python чтение json

Начал изучать Pythonю пытаюсь прочитать json из стороннего файла

#!/usr/bin/env python3
import json;

print("Content-type: text/html");
print();

	
myfile = open("simple.json");     
string = myfile.read();
print(json.dumps(string, sort_keys=True))


В переменную string содержимое файла приходит. А вот json.dumps не срабатывает. Обьясните плиз что не так делаю или как подругому надо?

И вопрос в догонку можно ли устроить чтоб пайтон выводил ошибки на страницу как PHP. А то я файлики кидию на хост, чуть что не так получаю ощибку 500
Ответ: Вообщем вот что у меня получилось:

import json
from pprint import pprint

with open('data.json') as data_file:    
    data = json.load(data_file)

#pprint(data)

print(data["maps"][0]["id"]);
print(data["masks"]["id"]);
print(data["om_points"]);


Cам json Фаил выглядит так:

автор
{
"maps": [
{
"id": "blabla",
"iscategorical": "0"
},
{
"id": "blabla",
"iscategorical": "0"
}
],
"masks": {
"id": "valore"
},
"om_points": "value",
"parameters": {
"id": "valore"
}
}
Вопрос: Проблема с кодировкой JSON (Embarcadero Delphi XE5)

Всем привет. Есть 2 программы: одна заливает обновление на сервер, другая - скачивает. На сервер заливается само обновление (exe-шник) и json-файл с метаифнормацией с помощью скрипта WinSCP.

Структура json такая:

{"version":"1.0.20.0",
"cdate":"17.07.2017",
"file":"Setup_System.exe",
"changes":["Изменили дизайн","исправили ошибки","и т.д."]}

Поле Changes это изменения в новой версии.

На сервер заливается нормальный json (в кодировке ANSI), все читабельно, а когда получаю json с сервера, то в массиве changes кракозябры.
К серверу подключаюсь через TIdHttp.

Создание json на клиенте:
function TForm1.SaveToJson(): boolean;
var
  JSONObject: TJSONObject;
  Pair: TJSONPair;
  JsonArray: TJSONArray;
  S: TStringList;
  i: integer;
begin
  S := TStringList.Create;
try
  Result := true;
  JSONObject := TJSONObject.Create;
  Pair := TJSONPair.Create('version', currentVersion);
  JSONObject.AddPair(Pair);
  Pair := TJSONPair.Create('cdate', DateToStr(dtpCurrentDate.DateTime));
  JSONObject.AddPair(Pair);
  Pair := TJSONPair.Create('file', GetFileName());
  JSONObject.AddPair(Pair);

  JsonArray := TJSONArray.Create();
  for i := 0 to mmoWhatsNew.Lines.Count - 1 do
  begin
    if Length(mmoWhatsNew.Lines[i]) > 0 then
      JsonArray.Add(mmoWhatsNew.Lines[i]);
  end;
  JSONObject.AddPair('changes',JsonArray);

  S.Add(JSONObject.ToString);
  S.SaveToFile(pathToUploader + 'release\' + jsonFile, TEncoding.ANSI);

  S.Free;
  JSONObject.Destroy;
end;


Чтение json-а:
json := Connect.Get(ServiceURL);
JsonMeta := TJSONObject.ParseJSONValue(TEncoding.ANSI.GetBytes(json), 0) as TJSONObject;

Distrib := jsonMeta.GetValue('file').Value;
CDate := jsonMeta.GetValue('cdate').Value;
Changes := jsonMeta.Get('changes').JsonValue as TJSONArray;


З.Ы. Читал другие темы на этом форуме и вообще в инете искал, так и не смог разобраться в чем дело/

К сообщению приложен файл. Размер - 24Kb
Ответ: энди,

Хм.... Вообще-то Анри, пока его борманы не обломали и он еще дельфями занимался, как раз на новые версии и ориентировался.

Т.е. да, потом он в SuperObject Добавил поддержку D7 "по просьбам трудящихся", потом поломал, потом снова поправил и т.д.

А в иксе, видимо, не заморачивались и не стали даже пытаться исправить.
Я когда-то реально пытался понять, на хрена его форкнули, но так и не понял.

PS. а наиболее быстрый с прицелом на обязательную поддержку D7 и FPC - пожалуй mORMot
Хотя мне в json'е никогда не приходилось выжимать скорость
Вопрос: Масштабируемость JSON парсера

Предложите пожалуйста варианты как можно обеспечить масштабируемость JSON парсера.

Например возможен вариант когда в JSON'e появятся новые поля или каких-нибудь не станет, нужно написать парсер чтобы он верно отработал и распарсил JSON. Это и имею ввиду под масштабируемостью.

Заранее спасибо за идеи !!!
Ответ:
Andrey3k
Нужно сделать так чтобы парсер отработал корректно даже если JSON немного изменится.

Умиляет. Ну, "парсер" может собрать все значения в Map и ему абсолютно не важно какие именно там ключи и значения. Но бизнес-логика что будет делать с этими изменениями, умник?
Вопрос: Преобразование текста в JSON {Python}

Всем привет.

Как преобразовать текст с форматирование (табуляция, новая строка ) в JSON ?
Прошу строго не судить. Нужен Ваш совет.

Руками сделать JSON-файл или все же есть другой способ ?

Заранее спасибо.
Ответ:
anvano
Независимо от Python / не Python, если вам надо кусок произвольного текста воткнуть в виде секции в JSON - то только сериализация вас спасёт, кто знает какие символы еще кроме новых строк и табуляций там будут. Запакуйте например в base64, на стороне клиента распакуете.


Ок, вас понял. Подошел к задаче с другой стороны
Вопрос: JSON-RPC что есть готового в XE7

Доброе время суток всем,

что есть готового до Delphi xe7 (в принципе даже до xe8) на тему сабжа?
нашел упоминание о Indy JSON-RPC все остальное на уровне самому ваять строку с json и слать принимать через POST запросы.

надо оценить время разработки клиента под указанный протокол
(поменять протокол не могу т к сервер не наш).

Спасибо
Ответ: Mikhail Tchervonenko,

а вообще, учитывая наличие XE7 и незначительные требования по скорости, походу вполне достаточно System.JSON в связке с Indy для работы с ssl. Только аккуратно обходить deprecated методы.
Вопрос: JSON ошибка синтаксиса

Всем привет!
Какая-то ерунда - не могу разобраться где сделал ошибку при отправке json запроса на сервер - метод post.
Вот краткая схема классов.
Добавляет элемент в коллекцию.
package ru.demo.serv.messanger2.service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import ru.demo.serv.messanger2.database.Database;
import ru.demo.serv.messanger2.model.Message;
import ru.demo.serv.messanger2.model.Profile;

public class MassegeService {
	
		private Map<Long, Message> messages = Database.getInstanceOfmessages();
		private Map<Long, Profile> prof = Database.getInstanceOfprof();
		
		
		public MassegeService(){
			messages.put(1L, new Message(1,"Koleman", "Hello and how privet!!!"));
			messages.put(2L, new Message(2,"Merphy", "Lonlyness in city!!!"));
		}
	

		
		public Message addMessage(Message mess){
		long id = messages.size()+1;
		messages.put(id, mess);
			return mess;
		}
		


класс который обрабатывает запрос
@Path("/messages")
public class messageResource {
	
	MassegeService service = new MassegeService();


@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Message addMessage(Message mess){
	
	return service.addMessage(mess);
}


пытаюсь отправить в запросе

[
  {
    "author": "Mike",
    "id": 3,
    "message": "Go ahead punks!!!"
  }


сообщение об ошибке:
автор
</head><body><h1>HTTP Status 400 - Bad Request</h1><div class="line"></div><p><b>type</b> Status report</p><p><b>message</b> <u>Bad Request</u></p><p><b>description</b> <u>The request sent by the client was syntactically incorrect.</u></p><hr class="line"><h3>Apache Tomcat/8.0.26</h3></body></html>


Кто сталкивался можете рассказать где ошибка?
Ответ: Dr.Hofmann, а мы, наверное, должны догадаться, каким образом вы передаете запрос.
В запросе точно указано в заголовке Content-Type, что в теле запроса передается application/json ?