web-dev-qa-db-ja.com

Android JSONObjectの解析

JsonをAndroidアプリに解析するのに少し問題があります。

これは私のjsonファイルがどのように見えるかです:

{
"internalName": "jerry91",
"dataVersion": 0,
"name": "Domin91",
"profileIconId": 578,
"revisionId": 0,
}

ご覧のとおり、この構造は少し奇妙です。アプリでそのデータを読み取る方法がわかりません。私が気づいたように、それらはすべて配列ではなくオブジェクトです:/

11
Dominik

2018年更新

5年後、Androidでjsonを解析するための新しい「標準」があります。 moshiと呼ばれ、GSON 2.0と見なすことができます。よく似ていますが、使用を開始するときに最初の障害となる設計上のバグが修正されています。

https://github.com/square/moshi

まず、次のようなmvn依存関係として追加します。

<dependency>
  <groupId>com.squareup.moshi</groupId>
  <artifactId>moshi-kotlin</artifactId>
  <version>1.6.0</version>
</dependency>

追加した後、次のように使用できます(例から取得)。

String json = ...;

Moshi moshi = new Moshi.Builder().build();
JsonAdapter<BlackjackHand> jsonAdapter = moshi.adapter(BlackjackHand.class);

BlackjackHand blackjackHand = jsonAdapter.fromJson(json);
System.out.println(blackjackHand);

GitHubページの詳細情報:)

[古い]

Gson を使用することをお勧めします。

チュートリアルのリンクは次のとおりです。

  1. 変換方法Java GSONを使用してJSON形式からobjecto =
  2. GSONを使用したJSONファイルの解析
  3. 単純なGSONの例
  4. JSONデータの変換Javaオブジェクト

Gsonのalternativeを使用できます Jackson =。

  1. 5分でジャクソン
  2. 変換方法Java jsonとの間のオブジェクト

このライブラリは、基本的にJSONをJava指定したクラスに解析します。

10

古き良き json.org libをいつでも使用できます。あなたのJavaコード:

  • 最初にjsonファイルのコンテンツをStringに読み取ります。
  • 次に、それをJSONObjectに解析します:

    JSONObject myJson = new JSONObject(myJsonString);
    // use myJson as needed, for example 
    String name = myJson.optString("name");
    int profileIconId = myJson.optInt("profileIconId");
    // etc
    
24
kiruwka

文字列がJSONArrayJSONObjectかを知る

JSONArray文字列は次のようになります

[{
"internalName": "blaaa",
"dataVersion": 0,
"name": "Domin91",
"profileIconId": 578,
"revisionId": 0,
},
{
"internalName": "blooo",
"dataVersion": 0,
"name": "Domin91",
"profileIconId": 578,
"revisionId": 0,
}]

JSONOjectとしてのこの文字列

{
"internalName": "domin91",
"dataVersion": 0,
"name": "Domin91",
"profileIconId": 578,
"revisionId": 0,
} 

しかし、JSONArrayJSONObjectから要素を呼び出す方法は?

JSNOObjectこのように呼び出される情報

最初にオブジェクトをデータで満たします

JSONObject object = new JSONObject(
"{
\"internalName\": \"domin91\",
\"dataVersion\": 0,
\"name\": \"Domin91\",
\"profileIconId\": 578,
\"revisionId\": 0,
}"
);

オブジェクトから情報を呼び出すことができるようになりました

String myusername = object.getString("internalName");
int dataVersion   = object.getInt("dataVersion");

JSONArrayから情報を呼び出す場合は、オブジェクトの位置番号を知る必要があります。または、情報を取得するためにJSONArrayをループする必要があります

ループ配列

for ( int i = 0; i < jsonarray.length() ; i++)
{
   //this object inside array you can do whatever you want   
   JSONObject object = jsonarray.getJSONObject(i);
}

JSONArray内のオブジェクトの位置がわかっている場合、このように呼び出します

//0 mean first object inside array
 JSONObject object = jsonarray.getJSONObject(0);
9
Jack K Fouani

この部分はonBackgroundAsyncTaskで行います

  JSONParser jParser = new JSONParser();
 JSONObject json = jParser.getJSONFromUrl(url);


        try {

            result = json.getString("internalName");
                            data=json.getString("dataVersion");
                      ect..


        } catch (JSONException e) {
            e.printStackTrace();
        }

JsonParser

 public class JSONParser {

static InputStream is = null;
static JSONObject jObj = null;
static String json = "";

// constructor
public JSONParser() {

}

public JSONObject getJSONFromUrl(String url) {

    // Making HTTP request
    try {
        // defaultHttpClient
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);
        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "utf-8"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        json = sb.toString();
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

    // try parse the string to a JSON object
    try {
        jObj = new JSONObject(json);
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }

    // return JSON String
    return jObj;

}
  }
2
Kostya Khuta

@jmeierが答えに書いたように、gsonのようなライブラリを使用することをお勧めします。ただし、Androidのデフォルトでjsonを処理する場合は、次のようなものを使用できます。

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String s = new String("{\"internalName\": \"domin91\",\"dataVersion\": 0,\"name\": \"Domin91\",\"profileIconId\": 578,\"revisionId\": 0,}");

        try {
            MyObject myObject = new MyObject(s);
            Log.d("MY_LOG", myObject.toString());
        } catch (JSONException e) {         
            Log.d("MY_LOG", "ERROR:" + e.getMessage());
        }


    }

    private static class MyObject {
        private String internalName;
        private int dataVersion;
        private String name;
        private int profileIconId;
        private int revisionId;

        public MyObject(String jsonAsString) throws JSONException {
            this(new JSONObject(jsonAsString));
        }

        public MyObject(JSONObject jsonObject) throws JSONException {
            this.internalName = (String) jsonObject.get("internalName");
            this.dataVersion = (Integer) jsonObject.get("dataVersion");
            this.name = (String) jsonObject.get("name");
            this.profileIconId = (Integer) jsonObject.get("profileIconId");
            this.revisionId = (Integer) jsonObject.get("revisionId");
        }

        @Override
        public String toString() {
            return "internalName=" + internalName + 
                    "dataVersion=" + dataVersion +
                    "name=" + name +
                    "profileIconId=" + profileIconId + 
                    "revisionId=" + revisionId;
        }

    }

}
0
Devrim

ここでは、アセットフォルダーから任意のファイルを解析でき、アセットフォルダーからファイルを取得できます

public void loadFromAssets(){
    try {
        InputStream is = getAssets().open("yourfile.json");
        readJsonStream(is);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

JSONをクラスオブジェクトに変換する

public void  readJsonStream(InputStream in) throws IOException {
    Gson gson = new Gson();
    JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
    reader.setLenient(true);
    int size = in.available();
    Log.i("size", size + "");

    reader.beginObject();


    long starttime=System.currentTimeMillis();
    while (reader.hasNext()) {
        try {
            Yourclass message = gson.fromJson(reader, Yourclass.class);
        }
        catch (Exception e){
            Toast.makeText(this, e.getCause().toString(), Toast.LENGTH_SHORT).show();
        }
    }
    reader.endObject();
    long endtime=System.currentTimeMillis();
    long diff=endtime-starttime;
    int seconds= (int) (diff/1000);
    Log.i("elapsed",seconds+"");
    reader.close();
}
0
Mohit Hooda

高速で軽量なJSONライブラリについては、 ig-jsonパーサー または Logan Square をチェックしてください。

比較のために、これはLogan Square開発者の統計です。 enter image description here

0
RayChongJH