在Word上将JSON从String加载到JSONArray中

时间:2011-11-29 23:40:59

标签: android json parsing

在尝试将JSON字符串加载到JSONArray中的过程中,我遇到了一些问题。我希望这里的帖子可以帮助我解决问题。

该文件位于assets文件夹中,包含Kabelskap类的对象。 JSON字符串的格式如下摘录:

[{"driftsmerking":"1420 10 04","objektnummer":"56569.0","adresse":"KANEBOGÅSEN    4","fabrikat":"NEBB","typebetegnelse":"KO500","spenning":"0.23","posisjon":"OK","kompNr":"1420","kommune":"1901 HARSTAD","latitude":"68.7786964342854","longitude":"16.5598512563035"},{"driftsmerking":"4416 01 04","objektnummer":"246349.0","adresse":"NONSÅSEN","fabrikat":"ABB","typebetegnelse":"KO300","spenning":"0.23","posisjon":"OK","kompNr":"4416","kommune":"1911 KVÆFJORD","latitude":"68.7367985627796","longitude":"16.2694481350258"},{"driftsmerking":"4080 05 02","objektnummer":"275933.0","adresse":"KVÆFJORD PLANTESKOLE VEKSTHUS","fabrikat":"ABB","typebetegnelse":"KO700","spenning":"0.23","posisjon":"OK","kompNr":"4080","kommune":"1911 KVÆFJORD","latitude":"68.7712454761326","longitude":"16.1901046355049"},{"driftsmerking":"1383 01 02","objektnummer":"150951.0","adresse":"SKILLEVN. 13","fabrikat":"ABB","typebetegnelse":"","spenning":"0.4","posisjon":"OK","kompNr":"1383","kommune":"1901 HARSTAD","latitude":"68.7781436806564","longitude":"16.5643438120601"},{"driftsmerking":"4085 07 02","objektnummer":"275122.0","adresse":"MATHUSET","fabrikat":"NEBB","typebetegnelse":"70","spenning":"0.23","posisjon":"OK","kompNr":"4085","kommune":"1911 KVÆFJORD","latitude":"68.7721426826508","longitude":"16.1785193494225"}]

该字符串被读入一个String变量,然后传递给此代码段:

try {
    JSONObject jsonObj = new JSONObject(finalString);

    for(int i = 0; i < json.length(); i++){
        Kabelskap ks = (Kabelskap) json.get(i);
        skap.put(ks.objektnummer, ks);
    }
} catch (JSONException e) {
    e.printStackTrace();
}

根据我的预期,这应该返回一个JSON数组,然后我可以迭代并转换为我的类的对象。

11-30 00:31:33.568: INFO/System.out(389): {"driftsmerking":"1420 10 04","objektnummer":"56569.0","adresse":"KANEBOG�SEN 4","fabrikat":"NEBB","typebetegnelse":"KO500","spenning":"0.23","posisjon":"OK","kompNr":"1420","kommune":"1901 HARSTAD","latitude":"68.7786964342854","longitude":"16.5598512563035"}{"driftsmerking":"4416 01 04","objektnummer":"246349.0","adresse":"NONS�SEN","fabrikat":"ABB","typebetegnelse":"KO300","spenning":"0.23","posisjon":"OK","kompNr":"4416","kommune":"1911 KV�FJORD","latitude":"68.7367985627796","longitude":"16.2694481350258"}{"driftsmerking":"4080 05 02","objektnummer":"275933.0","adresse":"KV�FJORD PLANTESKOLE VEKSTHUS","fabrikat":"ABB","typebetegnelse":"KO700","spenning":"0.23","posisjon":"OK","kompNr":"4080","kommune":"1911 KV�FJORD","latitude":"68.7712454761326","longitude":"16.1901046355049"}{"driftsmerking":"1383 01 02","objektnummer":"150951.0","adresse":"SKILLEVN. 13" of type org.json.JSONObject cannot be converted to JSONArray
11-30 00:31:33.588: WARN/System.err(389):     at org.json.JSON.typeMismatch(JSON.java:107)
11-30 00:31:33.588: WARN/System.err(389):     at org.json.JSONArray.<init>(JSONArray.java:91)
11-30 00:31:33.588: WARN/System.err(389):     at org.json.JSONArray.<init>(JSONArray.java:103)
11-30 00:31:33.588: WARN/System.err(389):     at net.lovholm.kraftwerk.Kraftwerk.onCreate(Kraftwerk.java:68)

此错误消息表明格式化应该存在问题,但为了检查这一点,我已针对某些在线验证器测试了JSON结构,它似乎是有效的。

从日志返回的字符串似乎使用与文件UTF-8不同的编码。我不确定这是否可能是问题的一部分,或者这只是日志控制台的字符编码。

非常欢迎任何有关此问题的建议。

---- UPDATE ---- ---- UPDATE ---- ---- UPDATE ---- ---- UPDATE ----

我现在用aj.esler的建议更新了代码,它修正了我在上面的代码摘录中所做的一些错误。这是我的代码中较长的摘录,我仍然遇到上述错误消息的问题。看来这一行      JSONArray json = new JSONArray(finalString); 导致JSONArray构造函数中发生恶意事件。传入的String应该适应API的要求,使用有效的JSON语法和左括号。

try {
    AssetManager assetManager = getAssets();
    fis = assetManager.open(sourcePath);
    BufferedReader bw = new BufferedReader(new InputStreamReader(fis, "utf8"));
    while ((str = bw.readLine()) != null){
        finalString += str;
    }
} catch (FileNotFoundException e) {
        e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

System.out.println(finalString);

try {
    JSONArray json = new JSONArray(finalString);

    for(int i = 0; i < json.length(); i++){
        JSONObject jsonObj = json.getJSONObject(i);
        try {
        Kabelskap ks = getKabelskapFromJSON(jsonObj);
        skap.put(ks.objektnummer, ks);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
} catch (JSONException e) {
    e.printStackTrace();
}

-----更新2.0 --------

System.out.println(finalString)&gt;不确定读者或System.out.println()是否会跳过文本的长篇部分。我认为DDMS LogCat使用的是不支持挪威特殊字母的字符集。

11-30 11:02:27.888: INFO/System.out(4304): {"driftsmerking":"1420 10 04","objektnummer":"56569.0","adresse":"KANEBOG�SEN 4","fabrikat":"NEBB","typebetegnelse":"KO500","spenning":"0.23","posisjon":"OK","kompNr":"1420","kommune":"1901 HARSTAD","latitude":"68.7786964342854","longitude":"16.5598512563035"}{"driftsmerking":"4416 01 04","objektnummer":"246349.0","adresse":"NONS�SEN","fabrikat":"ABB","typebetegnelse":"KO300","spenning":"0.23","posisjon":"OK","kompNr":"4416","kommune":"1911 KV�FJORD","latitude":"68.7367985627796","longitude":"16.2694481350258"}{"driftsmerking":"4080 05 02","objektnummer":"275933.0","adresse":"KV�FJORD PLANTESKOLE VEKSTHUS","fabrikat":"ABB","typebetegnelse":"KO700","spenning":"0.23","posisjon":"OK","kompNr":"4080","kommune":"1911 KV�FJORD","latitude":"68.7712454761326","longitude":"16.1901046355049"}{"driftsmerking":"1383 01 02","objektnummer":"150951.0","adresse":"SKILLEVN. 13","fabrikat":"ABB","typebetegnelse":"","spenning":"0.4","posisjon":"OK","kompNr":"1383","kommune":"1901 HARSTAD","latitude":"68.7781436806564","longitude":"16.5643438120601"}{"driftsmerking":"4085 07 02","objektnummer":"275122.0","adresse":"MATHUSET","fabrikat":"NEBB","typebetegnelse":"70","spenning":"0.23","posisjon":"OK","kompNr":"4085","kommune":"1911 KV�FJORD","latitude":"68.7721426826508","longitude":"16.1785193494225"}{"driftsmerking":"3410 05 12","objektnummer":"35184.0","adresse":"HANS EGEDESGT. 20 (ERIKSGATE)","fabrikat":"NEBB","typebetegnelse":"","spenning":"0.23","posisjon":"OK","kompNr":"3410","kommune":"1901 HARSTAD","latitude":"68.7980203542316","longitude":"16.538182961594"}{"driftsmerking":"0800 06 10","objektnummer":"266928.0","adresse":"GAMNES V/MAGNE HARALD OLSEN","fabrikat":"ABB","typebetegnelse":"KO35","spenning":"0.23","posisjon":"OK","kompNr":"","kommune":"1901 HARSTAD","latitude":"68.8206299498345","longitude":"16.4915959572276"}{"driftsmerking":"2580 02 02","objektnummer":"186379.0","adresse":"RESSAN","fabrikat":"ELMEK","typebetegnelse":"50 CM","spenning":"0.23","posisjon":"OK","kompNr":"2580","kommune":"1913 SK�NLAND","latitude":"68.6729130202412","longitude":"17.127746958547"}{"driftsmerking":"1500 10 06","objektnummer":"193875.0","adresse":"TUVSLETTVN. 9","fabrikat":"ABB","typebetegnelse":"KO500","spenning":"0.23","posisjon":"OK","kompNr":"1500","kommune":"1901 HARSTAD","latitude":"68.74741783798","longitude":"16.5517037722856"}{"driftsmerking":"3282 02 02","objektnummer":"35547.0","adresse":"TEGEB�RVN. 12B","fabrikat":"NEBB","typebetegnelse":"","spenning":"0.23","posisjon":"OK","kompNr":"3282","kommune":"1901 HARSTAD","latitude":"68.7991934883357","longitude":"16.5033927383319"}{"driftsmerking":"1430 05 02","objektnummer":"116375.0","adresse":"�VERLAND 2","fabrikat":"ABB","typebetegnelse":"KO700","spenning":"0.23","posisjon":"OK","kompNr":"1430","kommune":"1901 HARSTAD","latitude":"68.7759663213591","longitude":"16.5611455110691"}{"driftsmerking":"4150 05 06","objektnummer":"275496.0","adresse":" NYVN. 21","fabrikat":"ABB","typebetegnelse":"KO500","spenning":"0.4","posisjon":"OK","kompNr":"4150","kommune":"1911 KV�FJORD","latitude":"68.7741925557284","longitude":"16.1726621696438"}{"driftsmerking":"1486 07 02","objektnummer":"162192.0","adresse":"ROHOLTVN. 7","fabrikat":"ABB","typebetegnelse":"KO 700","spenning":"0.23","posisjon":"OK","kompNr":"1486","kommune":"1901 HARSTAD","latitude":"68.7550368601091","longitude":"16.5679658964195"}{"driftsmerking":"3025 02 06 / 3060 /","objektnummer":"35174.0","adresse":"HANS EGEDESGT. 6 (HVEDINGSGATE)","fabrikat":"NEBB","typebetegnelse":"","spenning":"0.23","posisjon":"OK","kompNr":"3025","kommune":"1901 HARSTAD","latitude":"68.7994885383443","longitude":"16.5414817371666"}{"driftsmerking":"7045 03 06","objektnummer":"251410.0","adresse":"KONGSVIKDALEN","fabrikat":"","typebetegnelse":"","spenning":"0.23","posisjon":"OK","kompNr":"7045","kommune":"1852 TJELDSUND","latitude":"68.5682671357777","longitude":"16.2428412985428"}{"driftsmerking":"3010 03 02","objektnummer":"35143.0","adresse":"6.DIVISJONSGT. 10","fabrikat":"ABB","typebetegnelse":"KO500",

- 新更新 -

来自JSONArray(String json)构造函数的完整错误跟踪:

12-03 15:14:44.290: WARN/System.err(412): org.json.JSONException: Value {"posisjon":"OK","spenning":"0.23","driftsmerking":"1420 10 04","adresse":"KANEBOG�SEN 4","kompNr":"1420","objektnummer":"56569.0","typebetegnelse":"KO500","longitude":"16.5598512563035","latitude":"68.7786964342854","kommune":"1901 HARSTAD","fabrikat":"NEBB"} of type org.json.JSONObject cannot be converted to JSONArray
12-03 15:14:44.290: WARN/System.err(412):     at org.json.JSON.typeMismatch(JSON.java:107) 
12-03 15:14:44.290: WARN/System.err(412):     at org.json.JSONArray.<init>(JSONArray.java:91)
12-03 15:14:44.290: WARN/System.err(412):     at org.json.JSONArray.<init>(JSONArray.java:103)
12-03 15:14:44.290: WARN/System.err(412):     at net.lovholm.kraftwerk.Kraftwerk.onCreate(Kraftwerk.java:66)
12-03 15:14:44.290: WARN/System.err(412):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
12-03 15:14:44.290: WARN/System.err(412):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
12-03 15:14:44.290: WARN/System.err(412):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
12-03 15:14:44.290: WARN/System.err(412):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
12-03 15:14:44.290: WARN/System.err(412):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
12-03 15:14:44.290: WARN/System.err(412):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-03 15:14:44.290: WARN/System.err(412):     at android.os.Looper.loop(Looper.java:130)
12-03 15:14:44.290: WARN/System.err(412):     at android.app.ActivityThread.main(ActivityThread.java:3683)
12-03 15:14:44.290: WARN/System.err(412):     at java.lang.reflect.Method.invokeNative(Native Method)
12-03 15:14:44.290: WARN/System.err(412):     at java.lang.reflect.Method.invoke(Method.java:507)
12-03 15:14:44.290: WARN/System.err(412):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
12-03 15:14:44.290: WARN/System.err(412):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
12-03 15:14:44.290: WARN/System.err(412):     at dalvik.system.NativeStart.main(Native Method)

JSONArray初始化和getKabelskapfromJSON方法的实现:

  1. JSON数组初始化摘录

     try {
            JSONArray json = new JSONArray(finalString);
    
        for(int i = 0; i < json.length(); i++){
            JSONObject jsonObj = json.getJSONObject(i);
            try {
            Kabelskap ks = getKabelskapFromJSON(jsonObj);
            skap.put(ks.objektnummer, ks);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
    
  2. getKabelselskapFromJSON方法:

    私有Kabelskap getKabelskapFromJSON(JSONObject jsonObj)抛出JSONException {

    String driftsmerking = jsonObj.getString("driftsmerking");
    
    String adresse = jsonObj.getString("addresse");
    
    String objektnummer = jsonObj.getString("objektnummer");
    
    String spenning = jsonObj.getString("spenning");
    
    String fabrikat = jsonObj.getString("fabrikat");
    
    String typebetegnelse = jsonObj.getString("typebetegnelse");
    
    String posisjon = jsonObj.getString("posisjon");
    
    String kompNr = jsonObj.getString("kompNr");
    
    String kommune = jsonObj.getString("kommune");
    
    String latitude = jsonObj.getString("latitude");
    
    String longitude = jsonObj.getString("longitude");
    
    Kabelskap k = new Kabelskap(driftsmerking, objektnummer, adresse, fabrikat, typebetegnelse, spenning, posisjon, kompNr, kommune, latitude, longitude);
    
    return k;
    
  3. }

2 个答案:

答案 0 :(得分:7)

我可以看到一些问题:

  1. 您在第一行使用jsonObj,这是一个JSONObject。然后在for循环中,使用一个名为json的不同对象。我将假设这两个是同一个对象。否则,您的示例中缺少信息。
  2. JSONObject没有采用整数的方法get。有一个需要一个字符串,所以我认为你的意思是那个。
  3. JSONObject.get返回与您提供的密钥对应的数据。它返回一个Object。
  4. 您获得的错误是因为您正在尝试将JSONObject强制转换为Kabelskap。

    我要做的是创建一个如下所示的辅助方法。或者,您可以在Kabelstap对象上创建一个特殊的构造函数。

    public Kabelskap getKabelskapFromJSON(JSONObject jsonObj)
    {
        Kabelskap k = new Kabelskap();
    
        String driftsmerking = jsonObj.getString("driftsmerking");
        k.setDriftsmerking(driftsmerking);
    
        String addresse = jsonObj.getString("addresse");
        k.setAddresse(addresse);
    
        String objektnummer = jsonObj.getString("objektnummer");
        k.setObjektNummer(objektnummer);
    
        double spenning = jsonObj.getDouble("spenning");
        k.setSpenning(spenning);
    
        // ... and so on for each property.
    
        return k;
    }
    

    然后可以这样使用:

    try {
        JSONArray jsonArray = new JSONArray(yourJSONString);
        for(int i = 0; i < jsonArray.length(); i++)
        {
            JSONObject jsonObj = jsonArray.getJSONObject(i);
            Kabelskap k = getKabelskapFromJSON(jsonObj);
            // do something with k. eg
            System.out.println("Kabelskap@"+i+": "+k);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
    

    JSONObject的文档是here,JSONArray是here

答案 1 :(得分:0)

两件事,

  1. 解析数据时应该使用JSONArray
  2. 您需要解析json并自己创建Kabelskap对象。 json.get(i)将返回Object,在这种情况下将为JSONObject。使用JSONObject,然后使用getter获取字段并创建Kabelskap对象。