2016-05-11 3 views
-1

WordPressの残りのAPIに由来するJSONファイルがあります。これには、ユーザーのレコードが2つある種類のカスタム投稿があります。カスタムフィールドユーザーデータ(ID、名前、パス、client_type)、ここに私のJSONファイルは次のとおりです。Android上のJSONファイル内のオブジェクトの配列を変換中にエラーが発生しました

{ 
   "status": "ok", 
   "count": 2, 
   "count_total": 2, 
   "pages": 1, 
   "posts": [ 
      { 
         "id": 22, 
         "type": "userstiago", 
         "slug": "rascunho-automatico-2", 
         "url": "http://tkdhkd.96.lt/userstiago/rascunho-automatico-2/", 
         "status": "publish", 
         "title": "Rascunho automático", 
         "title_plain": "Rascunho automático", 
         "content": "", 
         "excerpt": "", 
         "date": "2016-05-10 18:00:48", 
         "modified": "2016-05-10 18:00:48", 
         "categories": [], 
         "tags": [], 
         "author": { 
            "id": 1, 
            "slug": "admin", 
            "name": "admin", 
            "first_name": "Tiago", 
            "last_name": "Goes", 
            "nickname": "Tiagodread", 
            "url": "", 
            "description": "Administrador da pagina" 
         }, 
         "comments": [], 
         "attachments": [], 
         "comment_count": 0, 
         "comment_status": "closed", 
         "custom_fields": { 
            "id": [ 
               "11111111111111" 
            ], 
            "name": [ 
               "Priscila" 
            ], 
            "pass": [ 
               "priscila" 
            ], 
            "client_type": [ 
               "common" 
            ] 
         }, 
         "taxonomy_tipo_cliente": [] 
      }, 
      { 
         "id": 21, 
         "type": "userstiago", 
         "slug": "rascunho-automatico", 
         "url": "http://tkdhkd.96.lt/userstiago/rascunho-automatico/", 
         "status": "publish", 
         "title": "Rascunho automático", 
         "title_plain": "Rascunho automático", 
         "content": "", 
         "excerpt": "", 
         "date": "2016-05-10 17:41:12", 
         "modified": "2016-05-10 17:41:12", 
         "categories": [], 
         "tags": [], 
         "author": { 
            "id": 1, 
            "slug": "admin", 
            "name": "admin", 
            "first_name": "Tiago", 
            "last_name": "Goes", 
            "nickname": "Tiagodread", 
            "url": "", 
            "description": "Administrador da pagina" 
         }, 
         "comments": [], 
         "attachments": [], 
         "comment_count": 0, 
         "comment_status": "closed", 
         "custom_fields": { 
            "id": [ 
               "456589546" 
            ], 
            "name": [ 
               "Alfred" 
            ], 
            "pass": [ 
               "12345" 
            ], 
            "client_type": [ 
               "common" 
            ] 
         }, 
         "taxonomy_tipo_cliente": [] 
      } 
   ] 
} 

、これは、Javaのコードです:

package tiagogoes.wprestandroidreceiver; 

import android.app.ProgressDialog; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import org.apache.http.client.HttpClient; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 
import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.UnsupportedEncodingException; 
import java.net.URL; 
import java.net.URLConnection; 
import java.net.URLEncoder; 
import java.util.ArrayList; 

public class MainActivity extends AppCompatActivity { 
    /** 
    * Called when the activity is first created. 
    */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final Button GetServerData = (Button) findViewById(R.id.GetServerData); 

     GetServerData.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 

       // WebServer Request URL 
       String serverURL = "http://tkdhkd.96.lt/api/get_user_posts/"; 

       // Use AsyncTask execute Method To Prevent ANR Problem 
       new LongOperation().execute(serverURL); 
      } 
     }); 

    } 


    // Class with extends AsyncTask class 

    private class LongOperation extends AsyncTask<String, Void, Void> { 

     // Required initialization 

     private final HttpClient Client = new DefaultHttpClient(); 
     private String Content; 
     private String Error = null; 
     private ProgressDialog Dialog = new ProgressDialog(MainActivity.this); 
     String data = ""; 
     TextView uiUpdate = (TextView) findViewById(R.id.output); 
     TextView jsonParsed = (TextView) findViewById(R.id.jsonParsed); 
     int sizeData = 0; 
     EditText txtlogin = (EditText) findViewById(R.id.txtlogin); 
     EditText txtsenha = (EditText) findViewById(R.id.txtsenha); 
     ArrayList<Usuario> users = new ArrayList<>(); 
     String loginloc, senhaloc; 

     protected void onPreExecute() { 
      // NOTE: You can call UI Element here. 

      //Start Progress Dialog (Message) 
      loginloc = txtlogin.getText().toString(); 
      senhaloc = txtsenha.getText().toString(); 

      Dialog.setMessage("Please wait.."); 
      Dialog.show(); 

      try { 
       // Set Request parameter 
       data += "&" + URLEncoder.encode("data", "UTF-8") + "=" + txtlogin.getText(); 

      } catch (UnsupportedEncodingException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 

     // Call after onPreExecute method 
     protected Void doInBackground(String... urls) { 

      /************ Make Post Call To Web Server ***********/ 
      BufferedReader reader = null; 

      // Send data 
      try { 

       // Defined URL where to send data 
       URL url = new URL(urls[0]); 

       // Send POST data request 

       URLConnection conn = url.openConnection(); 
       conn.setDoOutput(true); 
       OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); 
       wr.write(data); 
       wr.flush(); 

       // Get the server response 

       reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
       StringBuilder sb = new StringBuilder(); 
       String line = null; 

       // Read Server Response 
       while ((line = reader.readLine()) != null) { 
        // Append server response in string 
        sb.append(line + ""); 
       } 

       // Append Server Response To Content String 
       Content = sb.toString(); 
      } catch (Exception ex) { 
       Error = ex.getMessage(); 
      } finally { 
       try { 

        reader.close(); 
       } catch (Exception ex) { 
       } 
      } 

      /*****************************************************/ 
      return null; 
     } 

     protected void onPostExecute(Void unused) { 
      // NOTE: You can call UI Element here. 

      // Close progress dialog 
      Dialog.dismiss(); 

      if (Error != null) { 

       uiUpdate.setText("Output : " + Error); 

      } else { 

       // Show Response Json On Screen (activity) 
       uiUpdate.setText(Content); 

       /****************** Start Parse Response JSON Data *************/ 

       String OutputData = ""; 
       JSONObject jsonResponse; 

       try { 

        /****** Creates a new JSONObject with name/value mappings from the JSON string. ********/ 
        jsonResponse = new JSONObject(Content); 

        /***** Returns the value mapped by name if it exists and is a JSONArray. ***/ 
        /******* Returns null otherwise. *******/ 
        JSONArray jsonMainNode = jsonResponse.optJSONArray("posts"); 

        /*********** Process each JSON Node ************/ 

        int lengthJsonArr = jsonMainNode.length(); 

        for (int i = 0; i < lengthJsonArr; i++) { 
         /****** Get Object for each JSON node.***********/ 
         JSONObject jsonChildNode = jsonMainNode.getJSONObject(i); 

         /******* Fetch node values **********/ 
         String id = jsonChildNode.optString("id").toString(); 
         String name = jsonChildNode.optString("name").toString(); 
         String pass = jsonChildNode.optString("pass").toString(); 
         String client_type = jsonChildNode.optString("client_type").toString(); 


         Usuario u = new Usuario(id,nome,pass,client_type); 

         users.add(u); 


         for (Usuario us : users) { 

          Log.i("dados WS", us.getNome() + " - " + us.getSenha()); 

          if (us.getName().equalsIgnoreCase(loginloc) && us.getPass().equalsIgnoreCase(senhaloc)) { 
           Log.i("Mensagem", "OK"); 
          } else { 
           Log.i("Mensagem", "Username or password wrong!"); 
          } 
         } 


        } 
        /****************** End Parse Response JSON Data *************/ 

        //Show Parsed Output on screen (activity) 
        jsonParsed.setText(OutputData); 
       } catch (JSONException e) { 

        e.printStackTrace(); 
       } 


      } 
     } 

    } 

} 

それは上記のデータを持っていない、誰かが助けることができます私は解決する???

+0

関連するLogCatの出力を含め、取得しているエラーを投稿してください。 –

+0

ログエラーがなく、 "name"、 "pass"などのカスタムフィールドにあるデータを取得できないという問題があります。 –

+0

この場合、試行する前に 'custom_field'子ノードを取得していません'name'を取得します。 'optString'、' getString'とfriendsは現在のレベルだけを検索し、サブツリー全体は検索しないことに注意してください。デバッガを使ってコードを実行すると、これが明らかになりましたので、試してみてください。 –

答えて

0

あなたのjsonレスポンスは、custom_fieldsアイテムにアクセスするのはかなり複雑です。配列の代わりにcustom_fieldsのすべての項目をキーと値のペアとして入れることができます。 "name":"name_value"ですが、以下のコードはこれらの値を読み取る方法を示しています。

 JSONObject jsonChildNode = jsonMainNode.getJSONObject(i); 
     JSONObject fieldsObject = jsonChildNode.getJSONObject("custom_fields"); 
     JSONArray idArray = fieldsObject.getJSONArray("id"); 
     String idValue = idArray.getString(0); 

     JSONArray nameArray = fieldsObject.getJSONArray("name"); 
     String nameValue = nameArray.getString(0); 

     JSONArray passArray = fieldsObject.getJSONArray("pass"); 
     String passValue = passArray.getString(0); 

     JSONArray clientArray = fieldsObject.getJSONArray("client_type"); 
     String clientValue = clientArray.getString(0); 

visit SO : How to parse JSON in Android

happyCoding。

+0

あなたの助けをありがとう、それは完全に働いた。 –

1

現在のところ、RESTサービス経由でサーバーと通信するアプリを開発しています。簡単にサーバーへのすべての要求を処理し

  • 使用OkHttp、:ここで私はたくさんにバックエンドとの通信を簡素化するための方法であることが判明何。次に、レスポンスを文字列として取得できます(実際は文字列化されたJSONです)。
  • Gsonでこのレスポンス文字列を解析すると、JSONレスポンスのすべての文字列を読み込むことができなくなり、データを自分で解析する必要がなくなります。このために、以前はクラスとしてモデル化されたレスポンスを持つ必要があります。例えば:

    public class Blog implements Parcelable { 
    
        @SerializedName("status") 
        private String mStatus; 
    
        @SerializedName("count") 
        private int mCount; 
    
        @SerializedName("pages") 
        private int mPages; 
    
        @SerializedName("posts") 
        private ArrayList <Post> mPosts;  
        // "Post" is another Parcelable model class like this one 
    
        ... 
    
        // Implement getters and setters for each variable 
        ... 
    } 
    

SerializedNameは、Gsonのドキュメントによれば、この部材を示し

注釈は、そのフィールド名として指定された名前の値とJSONにシリアル化する必要があります。

したがって、SerializedNameに渡される文字列は、JSONレスポンスの項目のキーである必要があります。 はその後、バックonPostExecute()で、あなたは次のようにJSON文字列を解析することができます

Gson gson = new GsonBuilder().create; 
gson.fromJson(responseString, Blog.class); 

あなたは、これが役に立つことを願っ!私がうまく説明していないものがあるかどうか尋ねてください:)。

関連する問題