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

Новости подгружаются с помощью http с сервера, в какие контейнеры их стоит класть ?
Среда разработки - Android studio
Ответ: RecyclerView + CardView. При клике на карточку разворачивать ее на полный размер новости. Как вариант.
В отдельном фрагменте будет лучше (мое мнение).
При клике на новость - запускаете фрагмент и загружаете все что нужно, текст, картинки, соответсвенно гд-то лучше повесить прогрессбар на время загрузки
Вопрос: Парсинг на jsoup

Добрый всем день!
Заминка такая, уже весь гугл перелопатил, синих ссылок в браузере не осталось.
Есть пример парсинга сайта:
Код Java(TM) 2 Platform Standard Edition 5.0
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.ArrayList;
public class MainActivity extends Activity {
 
        // благодоря этому классу мы будет разбирать данные на куски
        public Elements title;
        // то в чем будем хранить данные пока не передадим адаптеру
        public ArrayList<String> titleList = new ArrayList<String>();
        // Listview Adapter для вывода данных
        private ArrayAdapter<String> adapter;
        // List view
        private ListView lv;
 
        @Override
        protected void onCreate(Bundle savedInstanceState) {
 
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                // определение данных
                lv = (ListView) findViewById(R.id.listView1);
                // запрос к нашему отдельному поток на выборку данных
                new NewThread().execute();
                // Добавляем данные для ListView
                adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.product_name, titleList);
        }
 
        /** А вот и внутрений класс который делает запросы, если вы не читали статьи у меня в блоге про отдельные
         * потоки советую почитать */
        public class NewThread extends AsyncTask<String, Void, String> {
 
                // Метод выполняющий запрос в фоне, в версиях выше 4 андроида, запросы в главном потоке выполнять
                // нельзя, поэтому все что вам нужно выполнять - выносите в отдельный тред
                @Override
                protected String doInBackground(String... arg) {
 
                        // класс который захватывает страницу
                        Document doc;
                        try {
                                // определяем откуда будем воровать данные
                                doc = Jsoup.connect("http://freehabr.ru/").get();
                                // задаем с какого места, я выбрал заголовке статей
                                title = doc.select(".title");
                                // чистим наш аррей лист для того что бы заполнить
                                titleList.clear();
                                // и в цикле захватываем все данные какие есть на странице
                                for (Element titles : title) {
                                        // записываем в аррей лист
                                        titleList.add(titles.text());
                                }
                        } catch (IOException e) {
                                e.printStackTrace();
                        }
                        // ничего не возвращаем потому что я так захотел)
                        return null;
                }
 
                @Override
                protected void onPostExecute(String result) {
 
                        // после запроса обновляем листвью
                        lv.setAdapter(adapter);
                }
        }
}
Но вот беда, код рабочий, но почему в listview заполняется только первая строка?
Мне надо с сайта спарсить новости.
Выглядит так:
Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
 doc = Jsoup.connect("http://www.red--sky.ru/").get();
                                // задаем с какого места, я выбрал заголовке статей
                                title = doc.select("#main_wrapper > div.container.boxed.blog.normal-page.container-wrap > div > div.col-lg-8 > div:nth-child(1) > div.blog-twrapper > div.blog-content");
                                // чистим наш аррей лист для того что бы заполнить
                                titleList.clear();
                                // и в цикле захватываем все данные какие есть на странице
                                for (Element titles : title) {
                                        // записываем в аррей лист
                                        titleList.add(titles.text());
В результате листвью заполняется одной строкой с первой новостью, почему остальное не парсится?
Ответ: А если так?
Код Java(TM) 2 Platform Standard Edition 5.0
1
2
titles.get(1).text();
titles.get(2).text();
Поясните, что тут происходит?
"#main_wrapper > div.container.boxed.blog.normal-page.container-wrap > div > div.col-lg-8 > div:nth-child(1) > div.blog-twrapper > div.blog-content"
Можно еще так:
Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
Elements div = doc.select("div.blog-post");
if (div.size() > 0) {
    for (int i = 0; i < div.size(); i++) {
        Log.d("", div.get(i).select("blog-content").text());
    }
}
Вопрос: Непонятная ошибка в Android Studio, парсинг, jsoup

Прошу помощи, ошибка, возможно будет банальной, т.к. это мое первое приложение в Android Studio.
В общем у меня стоит задача реализовать простое приложение для андроид, в котором будуд выводиться новости, погода и курс валют. Так сказать портал города.
Я разобрал отдельно несколько примеров, 1 с вкладками(tabs) и парочку с использованием библиотеки Jsoup для парсинга, но вместе я их реализовать не смог.. Выводит непонятную ошибку при выводе результата в листвью.
Java(TM) 2 Platform Standard Edition 5.0
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package com.example.llleff.myapplication;                                                               
                                                                                                        
        import android.app.TabActivity;                                                                 
        import android.os.Bundle;                                                                       
        import android.view.View;                                                                       
        import android.widget.TabHost;                                                                  
        import android.widget.TextView;                                                                 
        import android.os.AsyncTask;                                                                    
        import android.widget.ArrayAdapter;                                                             
        import android.widget.ListView;                                                                 
        import org.jsoup.Jsoup;                                                                         
        import org.jsoup.nodes.Document;                                                                
        import org.jsoup.nodes.Element;                                                                 
        import org.jsoup.select.Elements;                                                               
        import java.io.IOException;                                                                     
        import java.util.ArrayList;                                                                     
                                                                                                        
public class MainActivity extends TabActivity {                                                         
    // благодоря этому классу мы будет разбирать данные на куски                                        
    public Elements title;                                                                              
    // то в чем будем хранить данные пока не передадим адаптеру                                         
    public ArrayList<String> titleList = new ArrayList<String>();                                       
    // Listview Adapter для вывода данных                                                               
    private ArrayAdapter<String> adapter;                                                               
    // List view                                                                                        
    private ListView lv;                                                                                
                                                                                                        
    final String TABS_TAG_1 = "Tag 1";                                                                  
    final String TABS_TAG_2 = "Tag 2";                                                                  
                                                                                                        
                                                                                                        
    /** Called when the activity is first created. */                                                   
    public void onCreate(Bundle savedInstanceState) {                                                   
        super.onCreate(savedInstanceState);                                                             
        setContentView(R.layout.activity_main);                                                         
// определение данных                                                                                   
        lv = (ListView) findViewById(R.id.listView1);                                                   
        // запрос к нашему отдельному поток на выборку данных                                           
        new NewThread().execute();                                                                      
        // Добавляем данные для ListView                                                                
        adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.product_name, titleList);     
        TabHost tabHost = getTabHost();                                                                 
                                                                                                        
        TabHost.TabSpec tabSpec;                                                                        
                                                                                                        
        tabSpec = tabHost.newTabSpec(TABS_TAG_1);                                                       
        tabSpec.setContent(TabFactory);                                                                 
        tabSpec.setIndicator("Новости");                                                                
        tabHost.addTab(tabSpec);                                                                        
                                                                                                        
        tabSpec = tabHost.newTabSpec(TABS_TAG_2);                                                       
        tabSpec.setContent(TabFactory);                                                                 
        tabSpec.setIndicator("Курс валют");                                                             
        tabHost.addTab(tabSpec);                                                                        
                                                                                                        
    }                                                                                                   
                                                                                                        
    TabHost.TabContentFactory TabFactory = new TabHost.TabContentFactory() {                            
                                                                                                        
        @Override                                                                                       
        public View createTabContent(String tag) {                                                      
            if (tag == TABS_TAG_1) {                                                                    
                return getLayoutInflater().inflate(R.layout.tab, null);                                 
            } else if (tag == TABS_TAG_2) {                                                             
                TextView tv = new TextView(MainActivity.this);                                          
                lv.setAdapter(adapter);                                                                 
                return tv;                                                                              
            }                                                                                           
            return null;                                                                                
        }                                                                                               
    };                                                                                                  
    public class NewThread extends AsyncTask<String, Void, String> {                                    
                                                                                                        
        // Метод выполняющий запрос в фоне, в версиях выше 4 андроида, запросы в главном потоке выполнят
        // нельзя, поэтому все что вам нужно выполнять - выносите в отдельный тред                      
        @Override                                                                                       
        protected String doInBackground(String... arg) {                                                
                                                                                                        
            // класс который захватывает страницу                                                       
            Document doc;                                                                               
            try {                                                                                       
                // определяем откуда будем воровать данные                                              
                doc = Jsoup.connect("http://news.tut.by").get();                                        
                // задаем с какого места, я выбрал заголовке статей                                     
                title = doc.select(".title");                                                           
                // чистим наш аррей лист для того что бы заполнить                                      
                titleList.clear();                                                                      
                // и в цикле захватываем все данные какие есть на странице                              
                for (Element titles : title) {                                                          
                    // записываем в аррей лист                                                          
                    titleList.add(titles.text());                                                       
                }                                                                                       
            } catch (IOException e) {                                                                   
                e.printStackTrace();                                                                    
            }                                                                                           
            // ничего не возвращаем потому что я так захотел)                                           
            return null;                                                                                
        }                                                                                               
                                                                                                        
    }                                                                                                   
}                                                                                                       
                                                                                                        
Ответ: Никаких изменений...
Вопрос: Осуществить парсинг JSON с помощью готового макета "VKApiMessage"

Я никак не могу осуществить парсинг JSON с помощью готового макета "VKApiMessage".

Пример JSON:
Код JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
response: {
count: 3132,
unread_dialogs: 41,
items: [{
unread: 1,
message: {
id: 360658,
date: 1394122091,
out: 0,
user_id: 85635407,
read_state: 0,
title: ' ... ',
body: 'hey'
}
}]
}


VKApiMessege:

Код Java(TM) 2 Platform Standard Edition 5.0
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
public class VKApiMessage extends VKApiModel implements Identifiable, android.os.Parcelable {
 
    /**
     *  Message ID. (Not returned for forwarded messages), positive number
     */
    public int id;
 
    /**
     * For an incoming message, the user ID of the author. For an outgoing message, the user ID of the receiver.
     */
    public int user_id;
 
    /**
     *  Date (in Unix time) when the message was sent.
     */
    public long date;
 
    /**
     * Message status (false — not read, true — read). (Not returned for forwarded messages.)
     */
    public boolean read_state;
 
    /**
     * Message type (false — received, true — sent). (Not returned for forwarded messages.)
     */
    public boolean out;
 
    /**
     * Title of message or chat.
     */
    public String title;
 
    /**
     * Body of the message.
     */
    public String body;
 
    /**
     * List of media-attachments;
     */
    public VKAttachments attachments = new VKAttachments();
 
    /**
     * Array of forwarded messages (if any).
     */
    public VKList<VKApiMessage> fwd_messages;
 
    /**
     *  Whether the message contains smiles (false — no, true — yes).
     */
    public boolean emoji;
 
    /**
     * Whether the message is deleted (false — no, true — yes).
     */
    public boolean deleted;
 
    public VKApiMessage(JSONObject from) throws JSONException
    {
        parse(from);
    }
    /**
     * Fills a Message instance from JSONObject.
     */
    public VKApiMessage parse(JSONObject source) throws JSONException {
        id = source.optInt("id");
        user_id = source.optInt("user_id");
        date = source.optLong("date");
        read_state = ParseUtils.parseBoolean(source, "read_state");
        out = ParseUtils.parseBoolean(source, "out");
        title = source.optString("title");
        body = source.optString("body");
        attachments .fill(source.optJSONArray("attachments"));
        fwd_messages = new VKList<VKApiMessage>(source.optJSONArray("fwd_messages"), VKApiMessage.class);
        emoji = ParseUtils.parseBoolean(source, "emoji");
        deleted = ParseUtils.parseBoolean(source, "deleted");
        return this;
    }
 
    /**
     * Creates a Message instance from Parcel.
     */
    public VKApiMessage(Parcel in) {
        this.id = in.readInt();
        this.user_id = in.readInt();
        this.date = in.readLong();
        this.read_state = in.readByte() != 0;
        this.out = in.readByte() != 0;
        this.title = in.readString();
        this.body = in.readString();
        this.attachments = in.readParcelable(VKAttachments.class.getClassLoader());
        this.fwd_messages = in.readParcelable(VKList.class.getClassLoader());
        this.emoji = in.readByte() != 0;
        this.deleted = in.readByte() != 0;
    }
 
    /**
     * Creates empty Country instance.
     */
    public VKApiMessage() {
 
    }
 
    @Override
    public int getId() {
        return id;
    }
 
    @Override
    public int describeContents() {
        return 0;
    }
 
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(this.id);
        dest.writeInt(this.user_id);
        dest.writeLong(this.date);
        dest.writeByte(read_state ? (byte) 1 : (byte) 0);
        dest.writeByte(out ? (byte) 1 : (byte) 0);
        dest.writeString(this.title);
        dest.writeString(this.body);
        dest.writeParcelable(attachments, flags);
        dest.writeParcelable(this.fwd_messages, flags);
        dest.writeByte(emoji ? (byte) 1 : (byte) 0);
        dest.writeByte(deleted ? (byte) 1 : (byte) 0);
    }
 
    public static Creator<VKApiMessage> CREATOR = new Creator<VKApiMessage>() {
        public VKApiMessage createFromParcel(Parcel source) {
            return new VKApiMessage(source);
        }
 
        public VKApiMessage[] newArray(int size) {
            return new VKApiMessage[size];
        }
    };
}
Как осуществить парсинг JSONObject?
Вот часть моего кода, но не работает:
Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public void JSON(JSONObject JsonObject){
        TextView text = (TextView)findViewById(R.id.textnew);
        try{
            String v = JsonObject.toString();
 
            VKApiMessage de = new VKApiMessage().parse(JsonObject);
            String a = de.body;
 
            VKApiMessage df = new VKApiMessage(JsonObject).parse(JsonObject);
            String b = df.body;
 
            VKApiMessage dj = new VKApiMessage();
            String c = dj.parse(JsonObject).body;
 
            VKApiMessage dh = new VKApiMessage(JsonObject);
            String d = dh.parse(JsonObject).body;
 
            text.setText("1: " + a + "\n2: " + b + "\n3: " + c + "\n4: " + d + "\nOriginal: " + v);
            
        }catch (JSONException e){throw new RuntimeException(e);
        }
    }
Ответ: Решил проблему так:


Код Java(TM) 2 Platform Standard Edition 5.0
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
import com.vk.sdk.api.model.VKApiMessage;
import com.vk.sdk.api.model.VKList;
 
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
 
public class VkMessageArray extends VKList<VKApiMessage> {
 
    private VKList<VKApiMessage> messagesFromRequest;
    String jsonString;
 
 
    VkMessageArray(String jsonString) throws JSONException {
       this.jsonString = jsonString;
        messagesFromRequest = new  VKList<VKApiMessage>();
    }
 
    VKList<VKApiMessage> parseStr() throws JSONException {
        JSONObject jsonObj1 = new JSONObject(jsonString);
        JSONArray messagesArray = jsonObj1.getJSONObject("response").getJSONArray("items");
 
        for (int i = 0; i<messagesArray.length(); i++ ){
            messagesFromRequest.add(new VKApiMessage(messagesArray.getJSONObject(i)));
        }
 
        return messagesFromRequest;
 
    }
}
Вопрос: Ошибка при парсинге или как лучше сделать?

Ребята помогите пожалуйста. В папке assets у меня 7 txt. файлов.7 вопросов.

По нажатию на кнопку, происходит парсинг каждого файла и выводится вопрос, но когда делаешь

8 нажатие выскакивает ошибка, мол 8 файла нет.Оно и понятно, ведь его действительно нет.

Так как у меня парсинг происходит в отдельном класе, то в MainActivity

каждый фаил записывается в стринг переменную и потом разбивается на токины.

Java
1
2
String s1 = LoadTXT.TXT(this, parsing_txt);// записываем содержимое файла в переменную типа string
                     StringTokenizer st1 = new StringTokenizer(s1, "*");
Я решил сделать вот такую проверку:

Java
1
2
3
4
5
String end =  "8.txt";// файла которого нет
 
                 if(parsing_txt.equals(end)){
                     displayResult();
                 }

Я сравнил два стринга и все работает. Однако, препАД не принимает такую реализацию, говорит можно сделать все проще.

Подскажите как? интовую переменную, которая подсчитывает номер вопроса тоже использовать нельзя.
Ответ: Ребята, взял часть кода где возникает ошибка в try-catch и решил не париться.
Вопрос: Хранение и кэширование новостей

Доброе утро, сабж:
В какой контейнер следует подгружать новости ( обычного string не хватит ) и кэшировать ли их в preferences или есть более подходящий вариант ? В БД новости разбиты на несколько частей типа longstring .
Ответ: MisterMr, да. Почитайте о работе с базой данных на android, там всё несложно.
Вопрос: Оптимизация списка новостей

Написал я небольшое приложение которое выводит новости с одного сайта. Все бы ничего, но получилось много катртинок. Очень много. Примерно к 10 новости все начинает тормозить, дальше вылетает с out of memory. Есть ли возможность взять и скрыть вью, очистив память от картинок, но при этом не изменитьвысоту(чтоб скролл вью не прыгал) а потом если он вновь появится на экране - показать его?
Ответ: Spelcrawler, дело в том что я в своем проекте не использую ImageView. Я написал свой компонент, тк image view меня не устравает. В нем все битмапы после отрисовки вычищаются. Остается только канва.

Добавлено через 48 секунд
Сообщение от Spelcrawler
Там совсем другой механизм. Создается несколько вьюшек, так чтобы закрыть весь список и они просто перерисовываются при скролле.
механизм примерно понять я успел, пока писал аналог
Вопрос: Парсинг Html после выполнения скриптов

Здравствуйте!
Пытаюсь разобраться с парсингом страниц из интернета, вроде бы ничего сложного. Но возникла проблема - сайт, из которого я пытаюсь вытащить информацию, заполняется через пару секунд после открытия страницы, т.е. в исходном коде нужных данных нет.
Пользуюсь JSoup.
Код класса:
Код Java(TM) 2 Platform Standard Edition 5.0
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
38
private class NewThread extends AsyncTask<String, Void, String> {
 
        @Override
        protected String doInBackground(String... arg) {
 
            Elements title;
            Document doc;
            try {
                
                doc = Jsoup.connect("http://www.stratege.ru/xbox360/games#args:ajax=1").get();
 
                title = doc.select("div.platformDate_TPL_games");
 
                for (Element titles : title) {
 
                    date.add(titles.text().split(" — ")[1]);
                }
 
                title = doc.select("a.titleGamesTable");
 
                for (Element titles : title) {
 
                    name.add(titles.text());
                }
 
                title = doc.select("div.description_TPL_games");
 
                for (Element titles : title) {
 
                    desc.add(titles.text());
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
 
            return null;
        }
    }
Как мне получить исходный код после генерации данных?
Ответ:

Не по теме:

это выше моих способностей на данный момент
я уже попробовал HTMLUnit и Jsoup
почти уверен что первым можно сделать, но я его знаю на уровне "привет мир"

Вопрос: Парсинг XML с помощью Jsoup

Всем добрый день.

Пишу андроид приложение. Использую библиотеку jsoup. Возникла проблема с парсингом xml.
Есть такой кусок на разбор:

Код XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<item cbc:type="story" cbc:deptid="2.657" cbc:syndicate="true">
<title>
<![CDATA[
2 men drown near Cornwall, Ont., in human smuggling attempt, police allege
]]>
</title>
<link>
[url]http://www.cbc.ca/news/canada/ottawa/2-men-drown-near-cornwall-ont-in-human-smuggling-attempt-police-allege-1.3216699?cmp=rss[/url]
</link>
<guid isPermaLink="false">1.3216699</guid>
<pubDate>Fri, 4 Sep 2015 20:33:22 EDT</pubDate>
<author>CBC News</author>
<category>News/Canada/Ottawa</category>
<description>
<![CDATA[
<img title='Investigators with the Canada Border Services Agency carry out search warrants on the island of Montreal,
 in connection with a suspected contraband tobacco ring.' height='259' alt='Canada Border Sevices Agency' width='460' src='http://i.cbc.ca/1.2626726.1398859119!/fileImage/httpImage/image.jpg_gen/derivatives/16x9_460/canada-border-sevices-agency.jpg'/> 
<p>Two men from India have drowned and a third has been rescued in the St. Lawrence River near Cornwall, Ont., in what police allege was a human smuggling attempt.</p>
]]>
</description>
</item>

Author, pubDate, link достал без проблем:
Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
 
Elements news = document.getElementsByTag("item");
Elements titles = news.select("title");
Elements dates = news.select("pubDate");
Elements authors = news.select("author");
Осталось достать Title и src.
Код XML
1
2
3
4
5
<title>
<![CDATA[
2 men drown near Cornwall, Ont., in human smuggling attempt, police allege
]]>
</title>
Код XML
1
src='http://i.cbc.ca/1.2626726.1398859119!/fileImage/httpImage/image.jpg_gen/derivatives/16x9_460/canada-border-sevices-agency.jpg
Title достать удается, но вместе с "![CDATA[]]".
src же вообще не могу достать.

Буду рад любого рода подсказкам. Спасибо большое!

Добавлено через 34 минуты
Ответ найден:
Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
Elements description = news.select("description");
for (Element descr:description){
            String html = descr.text();          
            String src = Jsoup.parse(html).select("img").first().attr("src");
        }
Ответ:

Не по теме:

фигасе растет чувак, советы уже раздает

Вопрос: В чем преимущество использования библиотеки GSON перед стандартными средствами парсинга JSON?

В чем преимущество использования библиотеки GSON перед JSONObject JSONArray то есть перед стандартными средствами парсинга JSON ??
Ответ: Вот в которой обсуждаются все преимущества и недостатки основных видов библиотек для работы JSON