[ENTWICKLUNG] Json Konvertierung

  • Antworten:30
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 3.648

11.06.2017, 20:05:04 via Website

Hallo Jungs,

ich habe ein kleines Problem und komme einfach nicht auf den Trichter.

ich habe als Beispiel ein JSONObject, dass folgendes beinhaltet

   ,"url":"http:\/\/lyrics.wikia.com\/Rag%27N%27Bone_Man:Skin

nach JObject.getString("url") bekomme ich

http://lyrics.wikia.com/wiki/Rag%2527N%2527Bone_Man:Skin

Auch der Versuch mit

String url = new String(JObject.getString("url").getBytes("ISO-8859-1"), "UTF-8");

Bringt mir das gleiche Ergebnis

Irgend einer von euch eine Idee ?
P.s Im Prinzip möchte ich den String genau so haben , wie er drin steht , warum macht
mir getString die %25 rein ??

Ich danke euch für eure Mühe im Voraus

@Ludy : ich bin dran - ich muss erst den Mist vom Tisch bekommen

— geändert am 11.06.2017, 20:16:00

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Ludy
  • Admin
  • Forum-Beiträge: 7.888

11.06.2017, 20:15:06 via Website

Moin,

hiermit sollte es klappen:

try {
        Log.e("decode", URLDecoder.decode(s, "UTF-8"));
    } catch (UnsupportedEncodingException e) {
        Log.e("decode error", e.getLocalizedMessage());
    }

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

Lebensmittelwarnung-App

Download Samsung Firmware Tool

Meine Wunschliste

Telegram News Feed

Pascal P.swa00

Antworten
  • Forum-Beiträge: 3.648

11.06.2017, 20:21:34 via Website

Ich danke Dir ,

könntest du mir ggf erklären , warum ich die %25 bekomme ??

Ergebnis nach UrlDecoder:

"url":"http:\/\/lyrics.wikia.com\/Linkin_Park_%26_Kiiara:Heavy"

ergibt

http://lyrics.wikia.com/wiki/Linkin_Park_%2526_Kiiara:Heavy

Das wars leider auch nicht :-(

— geändert am 11.06.2017, 20:25:37

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Ludy
  • Admin
  • Forum-Beiträge: 7.888

11.06.2017, 20:27:55 via App

Das liegt daran, dass die URL doppelt encode ist.
Das Hochkomma bzw. Sonderzeichen wird vom Provider endoced, also müsstest du zweimal decoden.

— geändert am 11.06.2017, 20:30:58

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

Lebensmittelwarnung-App

Download Samsung Firmware Tool

Meine Wunschliste

Telegram News Feed

swa00

Antworten
  • Forum-Beiträge: 11.182

11.06.2017, 20:37:58 via Website

Liegt aber z.t. auch am Parser.
Mit Google Gson (was ich nutze, da ich aus einem Json direkt ein Java Objekt erstellen kann), ist das kein Problem und kommt passend raus.
Gerade getestet ;)

LG Pascal //It's not a bug, it's a feature. :) ;)

swa00Ludy

Antworten
  • Forum-Beiträge: 3.648

11.06.2017, 20:39:21 via Website

@Pascal

Ahhhhhhhhhhhhh :-)

Was für einen Import hast du genommen ?

ich habe diesen dort
import org.json.JSONException;
import org.json.JSONObject;

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 3.648

11.06.2017, 20:46:40 via Website

Ich danke euch mal , ich bastel eben um ....

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 3.648

11.06.2017, 21:10:00 via Website

Praktisch , thx :-)

Ihr Zwei seid in der Richtung ziemlich fit drauf :-)

Liebe Grüße - Stefan
[ App - Entwicklung ]

LudyPascal P.

Antworten
  • Forum-Beiträge: 3.648

11.06.2017, 21:33:29 via Website

Die Firma Dankt - Klapp wunderbar :-)

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 3.648

11.06.2017, 23:09:35 via Website

Jungs , noch eine Frage :

Aus dem Contentresolver bekomme ich so was hier raus ..

"Millionen Farben / Gestört aber GeiL feat"

Suche verzweifelt nach der richtigen Konvertierung

new String(ptext, "UTF-8")
new String(ptext, "ISO-8859-15")
new String(ptext, "ISO-8859-1")
URLDecoder.decode

Leider ohne Erfolg

EDIT :
So geht es
new String("Gestört aber GeiL feat".getBytes("ISO-8859-15"), "UTF-8");

— geändert am 12.06.2017, 00:07:41

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 11.182

12.06.2017, 05:36:34 via App

Ist die XML in UTF8? Wenn ja dürfte das garnicht erst passieren.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 3.648

12.06.2017, 06:27:06 via Website

Moin , Pascal

so kommen die Titel direkt aus dem ContentResolver ..
Also die interne DB, und dort in den CursorResults ....

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 11.182

12.06.2017, 06:29:53 via App

Hmm welchen Zeichensatz verwendet deine DB?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 3.648

12.06.2017, 06:34:44 via Website

öhm nicht meine Pascal :-)

Die habe ich gar nicht angelegt - das ist die System-interne DB
https://developer.android.com/reference/android/content/ContentResolver.html

und in meinem Falle ziehe ich mir die MediaFiles
String sorter = MediaStore.Audio.Media.TITLE + " ASC"
Cursur cur = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, sorter);
cur.moveFirst ......

usw

— geändert am 12.06.2017, 06:36:25

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 11.182

12.06.2017, 06:49:55 via App

Achso jetzt xD
Ist wohl noch zu früh heut morgen.
Naja solage es jetzt tut, ist alles OK ;)

LG Pascal //It's not a bug, it's a feature. :) ;)

swa00

Antworten
  • Forum-Beiträge: 3.648

12.06.2017, 06:53:52 via Website

Aber ich kann dich beruhigen , so richtig habe ich es immer noch nicht gelöst , denn
dieser Zeichensatz ist mir unbekannt :-)

"Ich Lass FÑŒr Dich Das Licht An"

Haste irgend eine Idee (trotz fehlendem Kaffee) ??? :-)

— geändert am 12.06.2017, 07:02:35

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 11.182

12.06.2017, 07:03:46 via App

Gerade nicht...
Man findet auch nix dazu in welchem Zeichensatz das in Android abgespeichert wird. Außer natürlich im mp3 ist das schon falsch, dann dürfte der Musik Player das aber auch nicht können.

LG Pascal //It's not a bug, it's a feature. :) ;)

swa00

Antworten
  • Forum-Beiträge: 3.648

12.06.2017, 07:15:31 via Website

Das ist das frustrierende , die "anderen" machen es :-(
An so nem Mist sitzt Du dann zwei Tage :-)
.

Hier - um nochmal auf ganz oben zurükzukommen Json / Gson

jetzt baut mir die jsoup auch so einen Mist

  String url_str= "http://lyrics.wikia.com/wiki/Rag%27N%27Bone_Man:Human";
  Document page = Jsoup.parse(new URL(url_str), 10_000);

IOExeption mit

http://lyrics.wikia.com/wiki/Rag%2527N%2527Bone_Man:Human 

Gibts dazu auch schon wieder ein workaround ??

Used :

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Node;
import org.jsoup.nodes.TextNode;`

— geändert am 12.06.2017, 07:22:39

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 11.182

12.06.2017, 07:17:40 via App

Was willst du denn aus der Url mit Jsoup parsen?
Hast die doch schon als reine Url vorliegen.
Und "auftrennen" geht übers Uri Objekt.

LG Pascal //It's not a bug, it's a feature. :) ;)

swa00

Antworten
  • Forum-Beiträge: 3.648

12.06.2017, 07:27:08 via Website

Ok, dann zeige ich mal , was ich mache :-)
Ich klaue die Lyrics :-)

a) Den kannste in einen Browser reinhauen
String url_str= "http://lyrics.wikia.com/wiki/Rag%27N%27Bone_Man:Human"

b) und dann kommt das

   Document page = Jsoup.parse(new URL(url_str), 10_000);
    Element lyricsBox = page.select("div.lyricbox").first();
    if(lyricsBox == null) { return null;}
    //unreleavante  Elemente  löschen
    lyricsBox.select("div.rtMatcher").remove();
    lyricsBox.select("div.lyricsbreak").remove();
    lyricsBox.select("script").remove();
    StringBuilder builder = new StringBuilder();
    for(Node curr : lyricsBox.childNodes()) {
        if(curr instanceof TextNode) {
            builder.append(((TextNode) curr).text());
        } else {
            builder.append("\n");
        }
    }
    return builder.toString();

Ergebnis :

org.jsoup.HttpStatusException: HTTP error fetching URL. Status=400, URL=http://lyrics.wikia.com/wiki/Rag%2527N%2527Bone_Man:Skin

Links ohne Sonderzeichen = kein Problem

Für die Probe :
http://lyrics.wikia.com/wiki/Rag%27N%27Bone_Man:Skin = failed
http://lyrics.wikia.com/wiki/Michael_Jackson:Earth_Song = OK

— geändert am 12.06.2017, 07:39:04

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 11.182

12.06.2017, 07:38:19 via App

Dann kann das wohl Jsoup nicht. Mal einen anderen Http Client probiert? bzw:
Was passiert wenn man die encoded Sonderzeichen wieder in passende Hochkomma umwandelt und dann parst?

LG Pascal //It's not a bug, it's a feature. :) ;)

swa00

Antworten
  • Forum-Beiträge: 3.648

12.06.2017, 07:42:28 via Website

Was passiert wenn man die encoded Sonderzeichen wieder in passende Hochkomma umwandelt und dann parst?

Dann passt es
Möchtest du mir damit verklickern , dass ich jetzt ne Tabelle brauche ??
a la replaceall ("%27","''");

Mal einen anderen Http Client probiert ?

Welchen z.b. - oder besser , was nehmt ihr ?

— geändert am 12.06.2017, 07:43:57

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 3.648

12.06.2017, 08:04:19 via Website

Das mit dem UrlDecoder hatte ich oben schon probiert - der verweigert auch seinen Deinst

Ion verwende ich auch ( an anderer Stelle )

Ich muss aber ehrlich jetzt gestehen , dass ich Ion noch nicht in der Art eingesetzt habe ,
wie ich oben Jsoup verwende.
(Maximal zum json request mit CallbackListener)

Geht das überhaupt ?? (parsen einer html & z.b. Divs remove)

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Ludy
  • Admin
  • Forum-Beiträge: 7.888

12.06.2017, 08:05:40 via Website

swa00

Möchtest du mir damit verklickern , dass ich jetzt ne Tabelle brauche ??
a la replaceall ("%27","''");

Nein, musst du nicht. Logisch gesehen kann die Url nur maximal zwei mal encoded sein, daher sollte zweimal decode ausgeführt werden.

    String url_str = "http://lyrics.wikia.com/wiki/Rag%2527N%2527Bone_Man:Skin";
    try {
        url_str = URLDecoder.decode(URLDecoder.decode(url_str, "UTF-8"), "UTF-8");
        Log.e("decode", URLDecoder.decode(URLDecoder.decode(url_str, "UTF-8"), "UTF-8"));
    } catch (UnsupportedEncodingException e) {
        Log.e("decode error", e.getLocalizedMessage());
    }
    new AsyncTask<String, String, String>() {

        @Override
        protected String doInBackground(String... _url) {
            try {
                Document page = Jsoup.connect(_url[0]).timeout(10000).get();
                Log.e("Title", page.title());
            } catch (MalformedURLException e) {
                Log.e("Malformed", e.getLocalizedMessage());
            } catch (IOException e) {
                Log.e("Malformed", e.getLocalizedMessage());
            }
            return null;
        }
    }.execute(url_str);

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

Lebensmittelwarnung-App

Download Samsung Firmware Tool

Meine Wunschliste

Telegram News Feed

swa00

Antworten
  • Forum-Beiträge: 3.648

12.06.2017, 08:38:25 via Website

Ach Ludy - schon so langsam wird es peinlich , dass du immer
den Punkt triffst :-) (2 mal encoded)

also : [LÖSUNG]

url_str = URLDecoder.decode(URLDecoder.decode(url_str, "UTF-8"), "UTF-8");

mag er nicht so richtig - die zwei Schritte muss man zu Fuss machen

String url_tmp = URLDecoder.decode(url_org, "UTF-8");
url_str = URLDecoder.decode(url_tmp, "UTF-8");

Und das löst gleichzeitig beide Probleme :

a) Das parsen aus dem JSON mit org.json.JSONObject ( also nicht gson)
b) Und das Document page = Jsoup.parse(new URL(url_str), 10_000); auch

.

Irgendwie werde ich euch im Impressum würdigen :-)
"This App was not possible without the excellent help of Pascal and Ludy - see also http://www.androipit.de"

:-)

— geändert am 12.06.2017, 08:49:27

Liebe Grüße - Stefan
[ App - Entwicklung ]

LudyPascal P.

Antworten
  • Forum-Beiträge: 3.648

12.06.2017, 10:20:33 via Website

NACHTRAG : Zum jsoup und doppel encode

Version 1.10.2 benötigt das Workaround wie oben beschrieben

Version 1.10.3 berücksichtigt dies von sich aus schon

Da soll ein Mensch mal drauf kommen :-)

Liebe Grüße - Stefan
[ App - Entwicklung ]

Ludy

Antworten