Problem med parseing i Android och JSON. String->double

Permalänk
Medlem

Problem med parseing i Android och JSON. String->double

Tja! Sitter och programmerar en app. Hämtar koordinater med JSON, ska göra om dessa från en String till en double, så jag kan sätta ut dessa koordinater i kartan.

Jag får ett NumberFormatException. Här nedan är koden och LogCat.

public class LagerActivity extends Activity { private static String url = "http://agent.nocrew.org/api/json/1.0/searchStore.json?limit=5..."; static final String TAG_ITEMS = "items"; static final String TAG_LAT = "lat"; static final String TAG_LNG = "lng"; private GoogleMap mMap; private LocationManager locationManager; JSONArray items = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_lager); mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)) .getMap(); // Creating JSON Parser instance JSONparser jParser = new JSONparser(); // getting JSON string from URL JSONObject json = jParser.getJSONFromUrl(url); try { // Getting Array of Contacts items = json.getJSONArray(TAG_ITEMS); // looping through All Contacts for (int i = 0; i < items.length(); i++) { JSONObject c = items.getJSONObject(i); // Storing each json item in variable String lat = c.getString(TAG_LAT); String lng = c.getString(TAG_LNG); // lat = lat.replace(",", "."); // lng = lng.replace(",", "."); // Log.e(lat, lng); double lati = Double.parseDouble(lat); Log.d(Double.toString(lati), " "); // LatLng point = new LatLng(Double.parseDouble(lat), // Double.parseDouble(lng)); // mMap.addMarker(new MarkerOptions().position(point) // .title("Karls räkor & hund") // .snippet("blaha, ehehe")); } } catch (JSONException e) { e.printStackTrace(); } } }

Här är min LogCat:

01-11 18:10:23.294: W/dalvikvm(22718): threadid=1: thread exiting with uncaught exception (group=0x40e86930) 01-11 18:10:23.294: E/AndroidRuntime(22718): FATAL EXCEPTION: main 01-11 18:10:23.294: E/AndroidRuntime(22718): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.checkmypint/com.example.checkmypint.LagerActivity}: java.lang.NumberFormatException: Invalid double: "" 01-11 18:10:23.294: E/AndroidRuntime(22718): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 01-11 18:10:23.294: E/AndroidRuntime(22718): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 01-11 18:10:23.294: E/AndroidRuntime(22718): at android.app.ActivityThread.access$600(ActivityThread.java:141) 01-11 18:10:23.294: E/AndroidRuntime(22718): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 01-11 18:10:23.294: E/AndroidRuntime(22718): at android.os.Handler.dispatchMessage(Handler.java:99) 01-11 18:10:23.294: E/AndroidRuntime(22718): at android.os.Looper.loop(Looper.java:137) 01-11 18:10:23.294: E/AndroidRuntime(22718): at android.app.ActivityThread.main(ActivityThread.java:5039) 01-11 18:10:23.294: E/AndroidRuntime(22718): at java.lang.reflect.Method.invokeNative(Native Method) 01-11 18:10:23.294: E/AndroidRuntime(22718): at java.lang.reflect.Method.invoke(Method.java:511) 01-11 18:10:23.294: E/AndroidRuntime(22718): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 01-11 18:10:23.294: E/AndroidRuntime(22718): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 01-11 18:10:23.294: E/AndroidRuntime(22718): at dalvik.system.NativeStart.main(Native Method) 01-11 18:10:23.294: E/AndroidRuntime(22718): Caused by: java.lang.NumberFormatException: Invalid double: "" 01-11 18:10:23.294: E/AndroidRuntime(22718): at java.lang.StringToReal.invalidReal(StringToReal.java:63) 01-11 18:10:23.294: E/AndroidRuntime(22718): at java.lang.StringToReal.parseDouble(StringToReal.java:248) 01-11 18:10:23.294: E/AndroidRuntime(22718): at java.lang.Double.parseDouble(Double.java:295) 01-11 18:10:23.294: E/AndroidRuntime(22718): at com.example.checkmypint.LagerActivity.onCreate(LagerActivity.java:65) 01-11 18:10:23.294: E/AndroidRuntime(22718): at android.app.Activity.performCreate(Activity.java:5104) 01-11 18:10:23.294: E/AndroidRuntime(22718): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 01-11 18:10:23.294: E/AndroidRuntime(22718): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 01-11 18:10:23.294: E/AndroidRuntime(22718): ... 11 more

Någon som har en susning om vad som är fel? Det är ju uppenbarligen något med parseningen.

Permalänk
Medlem

Invalid double: ""

om det är så enkelt som jag tror, så beror det på att en tom sträng inte kan omvandlas till en double.

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Medlem

Andra problem med just nummer är , samt . Då de används i olika språk och inställningar som nummer separator. vet inte hur det är i Java men kan vara något som det.

Visa signatur

Speldator: Ryzen 7800X3D, 64GB DDR5, RTX 3070
Server: i7-8700k, 32GB DDR4, RTX2080
Steam deck + de fiesta konsoller.

Permalänk
Medlem
Skrivet av jovnas:

Invalid double: ""

om det är så enkelt som jag tror, så beror det på att en tom sträng inte kan omvandlas till en double.

vid log.e() så skrivs värdena ut, så de bör inte vara tomt.

Skrivet av MugiMugi:

Andra problem med just nummer är , samt . Då de används i olika språk och inställningar som nummer separator. vet inte hur det är i Java men kan vara något som det.

Denna delen av koden (som ifs är utkommenterad nu) ska ändra "," till en ".":

// lat = lat.replace(",", "."); // lng = lng.replace(",", ".");

Och enligt logcaten så ska den ha ändrats, men kanske vid fel tillfälle

Men "." kanske inte fungerar alls? Ska testa och se om det går att att köra utan någon seperator!

Hittar verkligen inte felet i koden, letar ihjäl mig.

Permalänk
Medlem
Skrivet av kameltå:

vid log.e() så skrivs värdena ut, så de bör inte vara tomt.

eftersom du (enligt koden iaf) loggar med Log.e(lat, lng), så syns det kanske inte så bra i loggen om båda värdena är tomma strängar.
kör med Log.e("Lat", lat) och Log.e("Lng", lng) istället.
jag kan iaf inte tolka felmeddelandet (Invalid double: "") på annat sätt än att "" inte går att översätta till ett tal.

alternativt kan du ju köra en try/catch runt din parseDouble och sätta värdet till 0 om det inte gick att parsa.

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Medlem

Felet var bla. i XMLen. Vissa värden var tomma, så fick göra en ifsats för att checka detta:

if (lat == null || lat.length() == 0) { lat = "0"; } else { lati = Double.parseDouble(lat); } if (lng == null || lng.length() == 0) { lng = "0"; } else { lngi = Double.parseDouble(lng); }