3 Şubat 2014 Pazartesi

JAVA İLE JSON PARSE ETME

Önceki yazılarımdan birinde XML parse etmeyi ele almıştım.Bu yazımda başka bir kategorileme dili olan JSON un nasıl parse edildiğini ele alacağım.
JSON, javascript'in bir alt kümesi olan düzenli bir şekilde XML gibi içerik kategorileme dilidir. JSON XML'e göre daha da hızlıdır, daha pratiktir. XML gibi bütün programlama dillerinde etkin bir şekilde kullanılabilir.
Yapı olarak XML e çok benzeyen JSON tipinin ana amacı veri alış verişi yaparken daha küçük boyutlarda veri alıp göndermektir. Ayrıca kullanımı da çok kolaydır.
XML ve JSON karşılaştırması için bir örnek verelim. Bunun için Müşteri datalarını tuttuğumuzu varsayalım.

XML Örneği

01
<musteriler>
02
<musteri>

03
<kod>120.01.001</kod>
04
<ad>Microsoft</ad>

05
<unvan>Microsoft AŞ.</unvan>
06
</musteri>

07
<musteri>
08
<kod>120.01.002</kod>

09
<ad>Google</ad>
10
<unvan>Google AŞ.</unvan>

11
</musteri>
12
<musteri>

13
<kod>120.01.003</kod>
14
<ad>Yahoo</ad>

15
<unvan>Yahoo AŞ.</unvan>
16
</musteri>

17
<musteri>
18
<kod>120.01.004</kod>

19
<ad>Apple</ad>
20
<unvan>Apple AŞ.</unvan>

21
</musteri>
22
</musteriler>



Şimdide bunu JSON ile ifade edelim.
01
{musteriler:[
02
{

03
"kod":"120.01.001",
04
"ad"="Microsoft",

05
"unvan"="Microsoft AŞ",
06
}

07
{
08
"kod":"120.01.002",

09
"ad"="Google",
10
"unvan"="Google AŞ",

11
}
12
{

13
"kod":"120.01.003",
14
"ad"="Yahoo",

15
"unvan"="Yahoo AŞ",
16
}

17
{
18
"kod":"120.01.004",

19
"ad"="Apple",
20
"unvan"="Apple AŞ",

21
}
22
]}


Gördüğünüz üzere kodumuz oldukça azaldı ve yazması-okumasıda kolaylaştı.
Böyle 3-5 elemanlı örneklerde per bir performans göremesenizde 1000-2000 elemanlı örneklerde performans oldukça farkedecektir.
Java ile JSON okumak için org.json kütüphanesine ihtiyaç duyacağız.Bu kütüphaneyi buradan indirebilirsiniz.Kütüphaneyi projemize ekledikten sonra artık kodlama kısmına geçebiliriz.


JsonReader.java

public class JsonReader {
        private static String readAll(Reader rd) throws IOException {
        StringBuilder sb = new StringBuilder();
        int cp;
        while ((cp = rd.read()) != -1) {
            sb.append((char) cp);
        }
        return sb.toString();
    }

  
 public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException {
        InputStream is = new URL(url).openStream();
        try {
            BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
            String jsonText = readAll(rd);
            JSONObject json = new JSONObject(jsonText);
            return json;
        } finally {
            is.close();
        }
    }

    public static void main(String[] args) throws IOException, JSONException {
        JSONObject json = readJsonFromUrl("http://findyourmp.parliament.uk/api/search?q=bob&f=js");
        System.out.println(json.toString());
        for (int i = 0; i < json.getJSONObject("results").getJSONArray("members").length(); i++) {
            System.out.println("İsim:" + json.getJSONObject("results").getJSONArray("members").getJSONObject(i).get("member_name"));
        }
    }


Bu kodların çıktısı aşağıda ki gibi olur.





13 Aralık 2013 Cuma

COMPOSIT COMPONENTS(BİLEŞİK BİLEŞENLER)

JSF bileşenlerini bir sayfada bir araya getirerek onları gruplayabiliriz.Kendimize ait bir etiket adı ile de diğer JSF sayfalarından bir gruplanmış bileşeni çağırıp kullanabiliriz.
Composit components kullanılırsa JSF sayfalarının bakımı daha kolay olur.
Composit component sayfalarını aşağıda ki gibi lokalize etmeliyiz.



Burada "resources" klasörüne dikkat etmeliyiz.Başka bir isim altında composit componentleri çağıramıyoruz.
Daha fazla uzatmadan nasıl yazılıp nasıl kullanıldığına dair bir misal verelim.


iletisimForm.xhtml

<body>
        <composite:interface>
            <composite:attribute name="epostavalue"/>
            <composite:attribute name="sifrevalue"/>
            <composite:attribute name="mesajvalue"/>
            <composite:attribute name="gonderButton" method-signature="void action(javax.faces.event.ActionEvent)"/>
        </composite:interface>

        <composite:implementation>
            <h:form id="iletisimFormID">
                <h:panelGrid columns="2">
                    E-Posta:
                    <h:inputText value="#{cc.attrs.epostavalue}" size="30"/>
                    Şifre:
                    <h:inputSecret value="#{cc.attrs.sifrevalue}" size="30"/>
                    Mesaj:
                    <h:inputTextarea value="#{cc.attrs.mesajvalue}" cols="30" rows="10" />
                    <h:commandButton value="Gönder" action="#{cc.attrs.gonderButton}"/>
                </h:panelGrid>
            </h:form>
        </composite:implementation>
    </body>


index.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:depo="http://xmlns.jcp.org/jsf/composite/depo"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
<h:body>
        <depo:iletisimForm epostavalue="#{my.eposta}"
                           sifrevalue="#{my.sifre}"
                           mesajvalue="#{my.mesaj}"
                           gonderButton="#{my.mesajgonder()}"/>
    </h:body>

Sayfamız aşağıda ki gibi olur.




Burada yaptığımız şeylerin aynısını custom tag yazarak da yapabiliriz.Fakat JSF 2.0 dan sonra custom tag lerin yerini composit componentler almıştır.Composit componentleri kullanmak daha kolaydır.Çünkü custom tag yazmak için web.xml e müdahale söz konusudur.Aynı zamanda bu tagleri kaydedip kullanmak için bir taglib.xml dosyasına ihtiyaç duyarız.Bu taglib.xml dosyası her daim taşınıp projeye gömülebilir.Fakat her projede web.xml dosyasına ayar yapmak bir zaman kaybı olacağından custom tag yerine composit componentleri kullanmak daha eftaldir.

5 Aralık 2013 Perşembe

JAVA DA RSS OKUMA

RSS çeşitli internet siteleri tarafından yayınlanan haber vb. içeriğin tek bir ortamdan topluca izlenebilmesine olanak sağlayan yeni bir içerik besleme yöntemidir. RSS – Real Simple Syndication, RDF Site Summary veya RichSite Summary (Zengin Site Özeti) kelimelerinin baş harflerinden oluşan kısaltmadır. XML biçiminde olan RSS dosyaları ilk olarak NetScape firması tarafından geliştirilmeye başlanmıştır. RSS dosyalarının kullanımı her geçen gün artarak yaygınlaşmaktadır.
RSS yöntemini destekleyen sitelerin hazırladıkları XML biçimli dosyalara bir çok programla erişmek mümkündür. XML okuyucusu olan bu programlar, web gezgini veya e-posta istemcisi olabileceği gibi sadece RSS içeriği izlemek için hazırlanan masaüstü programları da olabilir.
İşte biz de bu yazımızda bir RSS linkinden gerekli bilgilerin nasıl çekildiğini öğreneceğiz.
RSS dosyalarında ki xml tag leri genelde aynıdır.Bunlar "title","content","date" ilh.
Tagler genelde aynı olduğundan,Java da RSS okuma işlemi için iki tane kütüphane yazılmıştır.Bu iki kütüphaneyi de projemize eklememiz gerekir.Bu kütüphaneler JDOM ve rome kütüphaneleridir.JDOM u buradan , rome kütüphanesini ise buradan indirebilirsiniz.
Bu kütüphaneleri indirip projemize ekledikten sonra artık kodlamaya başlayabiliriz demektir.RSS linki olarak kendi blogumun rss feed ini kullandım.


BlogItems.java

public class BlogItems implements Serializable {

    private String title;
    private String content;
    private String date;

    public BlogItems(String title, String content, String date) {
        this.title = title;
        this.content = content;
        this.date = date;
    }


public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }
}



BlogVeriler.java

public class BlogVeriler {

    private List<BlogItems> blogItems = new ArrayList<BlogItems>();
    private String url = "http://mesutemre.blogspot.com/feeds/posts/default?alt=rss";

    public List<BlogItems> getBlogItems() {
        return blogItems;
    }
    public void setBlogItems(List<BlogItems> blogItems) {
        this.blogItems = blogItems;
    }
    public void verileriGetir() {
        try {
            URLConnection feedUrl = new URL(url).openConnection();
            SyndFeedInput input = new SyndFeedInput();
            SyndFeed feed = input.build(new com.sun.syndication.io.XmlReader(feedUrl) {
            });
            List<SyndEntry> feedList = feed.getEntries();
            int feedSize = feedList.size();
            for (int i = 0; i < feedSize; i++) {
                SyndEntry entry = (SyndEntry) feedList.get(i);
                String title = entry.getTitle();
                String content = entry.getDescription().getValue();
                String date = entry.getPublishedDate().toString();
                blogItems.add(new BlogItems(title, content, date));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}