# Regex JSON



## Karotte21 (15. Jun 2011)

Guten Tag,

Ich habe folgendes Problem:

Meine application bekommt von der FB Graph API JSON daten zurück, die ich bereits in ein JSON Eintrag geparst habe.. hier 2 paar sample-Einträge aus dem Array:



> INFO: {"message":"Points: 274; Name: patrick","id":"182396081803634_206549349388307","application":{"id":"182396081803634","name":"EWA_SS11"},"from":{"id":"182396081803634","name":"EWA_SS11"},"created_time":"2011-06-15T10:52:06+0000","type":"status","updated_time":"2011-06-15T10:52:06+0000"}
> INFO: {"message":"Points: 294; Name: lukas","id":"182396081803634_206549026055006","application":{"id":"182396081803634","name":"EWA_SS11"},"from":{"id":"182396081803634","name":"EWA_SS11"},"created_time":"2011-06-15T10:50:29+0000","type":"status","updated_time":"2011-06-15T10:50:29+0000"}



Ich bin nun genau in den "message":"Points: Name:" part interessiert, also schaut mein javaRegex wie folgt aus:

```
Pattern p = Pattern.compile("\"message\":\".*?\"");
Matcher m;

//Und schließlich in der for schleife//
item = result.get(i);
m = p.matcher(item.toString());
```

item.toString entspricht genau den oben geposteten strings!

Was ist nun mein Problem?
Nun, laut RegEx: online regular expression testing match der Regex von weiter oben genau das was ich brauche, nämlich "group(0) => "message":"Points: 294; Name: lukas""

Der Regex ist ja sehr simpel, ich bin ja nicht dumm :>

Im Javaprogramm tut er das jedoch nicht, sobald ich versuche auf group(0) zuzugreifen, bekomme ich ein INFO: java.lang.IllegalStateException: No match found;

Und nun der Witz: Selbst mit einem ".*" als Regex (der bei p.matches("REGEX", "STRING") true ausgibt, krieg ich bei p.matcher und dem Versuch aus group zu lesen genau die gleiche Exception!

Wo ist mein Denkfehler? Ich programmier normalerweise in allem, nur nicht in Java, aber dennoch sollte so was simples doch machbar sein 

Ich sollte vielleicht noch dazu sagen, dass das ganze eine ICEFaces app ist und im Browser läuft, aber soweit ich das sehe verwende ich doch eh die standard java regex class.. also sollte das keinen Unterschied machen!


----------



## HoaX (15. Jun 2011)

Warum Regex? Es gibt so viele JSON-Libs für Java ... z.B. google-gson - A Java library to convert JSON to Java objects and vice-versa - Google Project Hosting

Zur Regex: Du definierst in deiner Regex keine Gruppe, also kannst du auch nicht darauf zugreifen. Mach ein ( ) außenrum:
	
	
	
	





```
Pattern p = Pattern.compile("(\"message\":\".*?\")");
```


----------



## SlaterB (15. Jun 2011)

extreme Denkfehler treten hier schon bei der Formulierung eines Forum-Posts auf, was ist da fürs Programmieren zu erwarten 

keinen sinnvollen Code geposten (wird je eine match() oder find()-Methode aufgerufen?)
und kein sinnvolles Beispiel

```
public class Test {
    public static void main(String[] args)  {
        String st = "INFO: {\"message\":\"Points: 274; Name: patric\"";

        Pattern p = Pattern.compile("\"message\":\".*\"");
        Matcher m = p.matcher(st);
        while (m.find())   {
            System.out.println(m.group());
            System.out.println(m.group(0));
        }
    }
}
```
funktioniert wie zu erwarten war


----------



## Karotte21 (15. Jun 2011)

Naja, mein Gedanke war: "Ich hab doch eh schon die Einträge und will doch nur die paar worte rausmatchen, und der Regex geht auch sehr einfach.." -> Ich dachte die Regex Variante wär schneller als "schaun was das kann was ich will" -> "library downloaden" -> "implementieren" !

Öhm hier ist der sinnvolle Code, tut mir leid falls das zu unleserlich war:


```
@Override
    public List<Score> getHighScoreList() throws Exception
    {
        JsonObject myfeed = this.fc.fetchObject(FB_API_KEY+"/feed", JsonObject.class);
        JsonArray result = myfeed.getJsonArray("data");
        Object item;
        Pattern p = Pattern.compile("\"message\":\".*?\"");
        Matcher m;
        String match;

        for(int i = 0; i < result.length(); i++)
        {
            item = result.get(i);
            m = p.matcher(item.toString());
            System.out.println(item.toString());
            match = m.group(0);
            //System.out.println(match);
        }
        return null;
    }
```

*Edit* Oh ich habe wohl ein m.find() vergessen, dachte das würde wie beim C# Regex.Matches() direkt erledigt.. naja dann wirds das wohl gewesen sein, danke dir!


----------

