2017-10-18 111 views
0

我从URL获取JSON - WooCommerce APIJava Android Studio restTemplate解析JSON

问题是我无法在应用程序中解析/输出它们。

没有错误,但它没有显示数据 - 只是标签。

MainActivity.java:

package at.copy_cat.app.rest; 

import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v7.app.ActionBarActivity; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; 
import org.springframework.web.client.RestTemplate; 

public class MainActivity extends ActionBarActivity { 

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

     if (savedInstanceState == null) { 
      getSupportFragmentManager().beginTransaction() 
        .add(R.id.container, new PlaceholderFragment()) 
        .commit(); 
     } 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     new HttpRequestTask().execute(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     if (id == R.id.action_refresh) { 
      new HttpRequestTask().execute(); 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    /** 
    * A placeholder fragment containing a simple view. 
    */ 
    public static class PlaceholderFragment extends Fragment { 

     public PlaceholderFragment() { 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      View rootView = inflater.inflate(R.layout.fragment_main, container, false); 
      return rootView; 
     } 
    } 


    private class HttpRequestTask extends AsyncTask<Void, Void, Greeting> { 
     @Override 
     protected Greeting doInBackground(Void... params) { 
      try { 
       final String url = "http://copy-cat.at/api/index.json"; 
       RestTemplate restTemplate = new RestTemplate(); 
       restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); 



       /**Greeting greeting = restTemplate.getForObject(url, Greeting[].class);**/ 
       Greeting greeting = restTemplate.getForObject(url, Greeting.class); 

       /** Greeting greeting = Arrays.asList(restTemplate.getForObject(url, Greeting[].class));**/ 
       RestTemplate rest = new RestTemplate(); 



       return greeting; 
      } catch (Exception e) { 
       Log.e("MainActivity", e.getMessage(), e); 
      } 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Greeting greeting) { 
      TextView greetingIdText = (TextView) findViewById(R.id.id_value); 
      TextView greetingContentText = (TextView) findViewById(R.id.content_value); 
      greetingIdText.setText(greeting.getId()); 
      greetingContentText.setText(greeting.getContent()); 
     } 

    } 

} 

Greeting.java:

package at.copy_cat.app.rest; 
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 
/** 
* Created by Michael on 17.10.2017. 
*/ 



@JsonIgnoreProperties(ignoreUnknown=true) 

public class Greeting { 

    private String products; 
    public String title; 


    public String getId() { 
     return this.products; 
    } 

    public String getContent() { 
     return this.title; 

    } 

} 

用一个简单的JSON这样的: { “ID”:161, “内容”:“你好,世界!“} 它的工作,但没有与此生成的JSON here

是它的一个PHP文件,但我在Java代码中包含PHP脚本相同的输出以.json使用...

的问题是:我怎么能解析同类商品的ID等信息

非常感谢!

编辑/ UPDATE: 现在,它看起来像这样

package at.copy_cat.app.rest; 

import android.util.Log; 

import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.util.HashMap; 
import java.util.List; 
/** 
* Created by Michael on 17.10.2017. 
*/ 



@JsonIgnoreProperties(ignoreUnknown=true) 

public class Greeting { 


    // getters and setters 
     public List products; 

     public String getContent(){ 
      String convertedToString = "" + products; 
      /**String[] value_split = convertedToString.split(",");**/ 
      String[] value_split = convertedToString.split("\\,"); 


      try { 

       JSONArray json = new JSONArray(products); 


       for(int i=0;i<json.length();i++){ 
        HashMap<String, String> map = new HashMap<String, String>(); 
        JSONObject e = json.getJSONObject(i); 

        /** Log.v("TEST23243235", "TESTOBJ" + e);**/ 
        /**JSONArray people = e.getJSONArray("products"); 
        int numOfPeople = e.getInt("images");**/ 
        map.put("id", String.valueOf(i)); 
        map.put("productid", "Product ID:" + e.getString("id")); 
        map.put("title", "Title: " + e.getString("title")); 
        map.put("permalink", "Permalink: " + e.getString("permalink")); 
        map.put("status", "Status: " + e.getString("status")); 
        map.put("regular_price", "Regular Price: " + e.getString("regular_price")); 
        map.put("price", "Price: " + e.getString("price")); 
        // map.put("description", "Description: " + e.getString("description")); 
        // map.put("categories", "Categories: " + e.getString("categories")); 
        // map.put("images", "Images: " + e.getString("images")); 


        Log.v("TEST23243235", "TESTOBJ" + map); 
        Log.v("TEST23243235", "TESTOBJ" + json); 
        Log.v("TEST23243235", "TESTOBJI" + i); 
        return map.toString(); 
       } 



       // Extract data from json and store into ArrayList as class objects 

        /**JSONObject json_data = jArray.getJSONObject(i); 

        String id = jObj.getString("id"); 

        Log.d("TEST23243235", "TEST" + id);**/ 





      } catch (JSONException e) { 
     Log.e("TEST23243235", "unexpected JSON exception", e); 
     // Do something to recover ... or kill the app. 

     } 
      return ""; 


     } 

     public void setProducts(List products){ 

      this.products = products; 
     } 
     public class Model { 
      private String title; 

      //other fields 

      //getters and setters 
     } 





    public String getId() { 
     return "1"; 
    } 

    /** public String getContent() { 
    return this.convertedToString; 

    }**/ 

} 

输出在logcat的

TESTOBJ{price=Price: 30.00, regular_price=Regular Price: 0.00, title=Title: Camera DS, status=Status: publish, permalink=Permalink: http://copy-cat.at/produkt/camera-ds-2, id=0, productid=Product ID:590} 

TESTOBJI0 

所以,现在我可以1个产品,但输出JSON的不是两个或更多.. .. 我能做些什么来解析所有产品不只是一个?

是的代码是不是干净的 - 关于我学习很抱歉...... :)

回答

0

products变量是私有的。它必须有一个setter。否则,杰克逊无法为其创造价值。

所以,你的JSON看起来像这样:

{ 
    "products": [ 
     {title and other fields} 
    ] 
} 

所以,你的类应该看起来像这样:

public class Products { 
    private List<Model> products; 
    // getters and setters 

    public static class Model { 
     private String title; 
     //other fields 

     //getters and setters 
    } 
} 

我们使用Products类的包装,因为JSON是包裹在products场了。

+0

谢谢,但它不是解决方案:( – user2806316

+0

@ user2806316我刚刚检查过.json版本不返回json它重定向到html版本。你确定你的URL吗? – Valentun

+0

url是http:// copy -cat.at/api/index.json – user2806316

0

你是否意识到在链接的json中,你得到一个包含对象数组的对象?

+0

是的,问题是我怎么解析:) – user2806316

+0

我总是喜欢要做的是用户基本的JSONObject和JSONArray类。我包含了到android开发者页面的链接。那是你需要的吗? JSONObject:https://developer.android.com/reference/org/json/JSONObject.html JSONArray:https://developer.android.com/reference/org/json/JSONArray.html – AnotherBiscuit

0

UPDATE:

package at.copy_cat.app.rest; 
import android.util.Log; 

import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 

import java.util.ArrayList; 
/** 
* Created by Michael on 17.10.2017. 
*/ 



@JsonIgnoreProperties(ignoreUnknown=true) 

public class Greeting { 


    // getters and setters 
     public ArrayList products; 

     public String getContent(){ 
      String convertedToString = "" + products; 
      String[] value_split = convertedToString.split(","); 

      Log.d("TEST23243235", "TEST" + products); 

      return convertedToString; 


     } 

     public void setProducts(ArrayList products){ 

      this.products = products; 
     } 
     public class Model { 
      private String title; 

      //other fields 

      //getters and setters 
     } 





    public String getId() { 
     return "1"; 
    } 

    /** public String getContent() { 
    return this.convertedToString; 

    }**/ 

} 

现在我有JSON输出的应用程序,并在控制台中。 现在的问题是 - 输出在〜1068标志停止。

这是输出:

10-18 19:54:22.256 13706-13706/at.copy_cat.app.rest D/TEST23243235: TEST[{title=Camera DS, id=590, created_at=2014-08-18T19:58:28Z, updated_at=2017-09-05T12:48:07Z, type=variable, status=publish, downloadable=false, virtual=false, permalink=http://copy-cat.at/produkt/camera-ds-2, sku=451039, price=30.00, regular_price=0.00, sale_price=null, price_html=<span class="woocommerce-Price-amount amount"><span class="woocommerce-Price-currencySymbol">&euro;</span>30.00</span> &ndash; <span class="woocommerce-Price-amount amount"><span class="woocommerce-Price-currencySymbol">&euro;</span>44.00</span>, taxable=false, tax_status=taxable, tax_class=, managing_stock=true, stock_quantity=12, in_stock=true, backorders_allowed=false, backordered=false, sold_individually=false, purchaseable=true, featured=true, visible=true, catalog_visibility=visible, on_sale=true, product_url=, button_text=, weight=0.20, dimensions={length=35, width=45, height=13, unit=cm}, shipping_required=true, shipping_taxable=true, shipping_class=box1-he, shipping_class_id=68, description=<p>Donec rutrum congue leo eget malesuada. Pellentesque in ipsum id orci porta dapibus. Praesent sapien massa, convallis a pellentesque nec, egestas non nisi. Vivamus suscipit tortor eget felis porttitor volutpat. Vivamus suscipit tortor eget felis porttitor volutpat. Praesent sapien massa, convallis a pellentesque nec, egestas non nisi. Curabitur non nulla sit amet nisl tempus convallis quis ac lectus. Donec sollicitudin molestie malesuada. Vestibulum ac diam sit amet quam vehicula elementum sed sit amet dui. Mauris blandit aliquet elit, eget tincidunt nibh pulvinar a.</p> 
                    , short_description=<p>Donec sollicitudin molestie malesuada. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec velit neque, auctor sit amet aliquam vel, ullamcorper sit amet ligula. Donec ..., reviews_allowed=true, average_rating=0.00, rating_count=0, related_ids=[125, 126, 138, 118, 140], upsell_ids=[], cross_sell_ids=[], parent_id=0, categories=[Adapters, Batteries, Cables&amp;Adapters, Camcoder Tapes &amp; Discs, Cameras, Cases, Digital Cameras, Digital SLR, Discs], tags=[], images=[{id=399, created_at=2014-08-18T13:52:46Z, updated_at=2014-08-18T13:52:46Z, src=http://copy-cat.at/wp-content/uploads/2014/06/a21.jpg, title=a2, alt=, position=0}, {id=419, created_at=2014-08-18T13:53:09Z, updated_at=2014-08-18T13:53:09Z, src=http://copy-cat.at/wp-content/uploads/2014/06/a61.jpg, title=a6, alt=, position=1}, {id=414, created_at=2014-08-18T13:53:04Z, updated_at=2014-08-18T13:53:04Z, src=http://copy-cat.at/wp-content/uploads/2014/06/a51.jpg, title=a5, alt=, position=2}, {id=409, created_at=2014-08-18T13:52:58Z, updated_at=2014-08-18T13:52:58Z, src=http://copy-cat.at/wp-content/uploads/2014/06/a41.jpg, title=a4, alt=, position=3}, {id=404, created_at=2014-08-18T13:52:52Z, updated_at=2014-08-18T13:52:52Z, src=http://copy-cat.at/wp-content/uploads/2014/06/a31.jpg, title=a3, alt=, position=4}, {id=399, created_at=2014-08-18T13:52:46Z, updated_at=2014-08-18T13:52:46Z, src=http://copy-cat.at/wp-content/uploads/2014/06/a21.jpg, title=a2, alt=, position=5}, {id=394, created_at=2014-08-18T13:52:41Z, updated_at=2014-08-18T13:52:41Z, src=http://copy-cat.at/wp-content/uploads/2014/06/a11.jpg, title=a1, alt=, position=6}], featured_src=http://copy-cat.at/wp-content/uploads/2014/06/a21.jpg, attributes=[{name=colors, slug=colors, position=0, visible=true, variation=true, options=[Black, Green]}], downloads=[], download_limit=-1, download_expiry=-1, download_type=standard, purchase_note=, total_sales=19, variations=[{id=6892, created_at=2015-01-16T09:03:52Z, updated_at=2015-01-16T09:03:52Z, downloadable=false, virtual=false, permalink=http://copy-cat.at/produkt/camera-ds-2?attribute_pa_colors=black, sku=451039, price=30.00, regular_price=35.00, sale_price=30.00, taxable=false, tax_status=taxable, tax_class=, managing_stock=parent, stock_quantity=12, in_stock=true, backordered=false, purchaseable=true, visible=true, on_sale=true, weight=0.20, dimensions={length=35, width=45, height=13, unit=cm}, shipping_class=box1-he, 

它停止@ shipping_class = BOX1-他。

输出需要这样的长度http://copy-cat.at/api/index.json 最新问题?

谢谢!

+0

它削减输出,因为日志猫有一个字符串长度的限制。别担心,你的json是好的。另外,请不要发布更新我们的答案,请编辑您的帖子,而不是 – Valentun

+0

好吧抱歉,新帖:)请看看我已经更新了第一篇文章。 – user2806316