2017-09-09 13 views
0

リクエストに応じてJSONを受け取ります。シンプルな変数にアクセスしてscreen.Butで印刷することができますが、深い変数にアクセスして印刷する方法がわかりません「オファー」クラスの変数にアクセスしたいのですが、どうすればいいですか? ここに私のモデルクラスがあります。深くネストされたJSONの変数にアクセスするには

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
using System; 
[Serializable] 
public class Fields 
{ 
} 
[Serializable] 
public class Queries 
{ 
} 
[Serializable] 
public class FacetResults 
{ 
    public Fields fields; 
    public Queries queries; 
} 
[Serializable] 
public class Fields2 
{ 
} 
[Serializable] 
public class Facet 
{ 
    public Fields2 fields; 
    public List<object> queries; 
} 
[Serializable] 
public class Fields3 
{ 
} 
[Serializable] 
public class Filter 
{ 
    public Fields3 fields; 
    public List<object> queries; 
} 
[Serializable] 
public class Stats 
{ 
} 
[Serializable] 
public class Request 
{ 
    public string __class__; 
    public Facet facet; 
    public Filter filter; 
    public int limit; 
    public string q; 
    public string sortby; 
    public int start; 
    public Stats stats; 
} 
[Serializable] 
public class Brand 
{ 
    public string __class__; 
    public string homepage_url ; 
    public string name ; 
    public string uid ; 
} 
[Serializable] 
public class Manufacturer 
{ 
    public string __class__ ; 
    public string homepage_url ; 
    public string name ; 
    public string uid ; 
} 
[Serializable] 
public class Prices 
{ 
    public List<List<object>> USD ; 
    public List<List<object>> GBP ; 
    public List<List<object>> INR ; 
    public List<List<object>> CNY ; 
    public List<List<object>> EUR ; 
    public List<List<object>> JPY ; 
} 
[Serializable] 
public class Seller 
{ 
    public string __class__; 
    public string display_flag ; 
    public bool has_ecommerce; 
    public string homepage_url; 
    public string id ; 
    public string name ; 
    public string uid ; 
} 
[Serializable] 
public class Offer 
{ 
    public string __class__ ; 
    public string _naive_id ; 
    public string eligible_region; 
    public int? factory_lead_days; 
    public int? factory_order_multiple; 
    public int in_stock_quantity ; 
    public bool is_authorized ; 
    public bool is_realtime ; 
    public string last_updated; 
    public int moq ; 
    public object octopart_rfq_url; 
    public string on_order_eta ; 
    public int? on_order_quantity ; 
    public int? order_multiple ; 
    public string packaging ; 
    public Prices prices ; 
    public string product_url ; 
    public Seller seller ; 
    public string sku; 
} 
[Serializable] 
public class Item 
{ 
    public string __class__ ; 
    public Brand brand ; 
    public Manufacturer manufacturer ; 
    public string mpn ; 
    public string octopart_url ; 
    public List<Offer> offers ; 
    public List<string> redirected_uids ; 
    public string uid ; 
} 
[Serializable] 
public class Result 
{ 
    public string __class__ ; 
    public Item item ; 
    public string snippet ; 
} 
[Serializable] 
public class SpecMetadata 
{ 
} 
[Serializable] 
public class StatsResults 
{ 
} 
[Serializable] 
public class RootOb 
{ 
    public string __class__ ; 
    public FacetResults facet_results; 
    public int hits ; 
    public int msec ; 
    public Request request; 
    public List<Result> results; 
    public SpecMetadata spec_metadata; 
    public StatsResults stats_results; 
    public string user_country ; 
    public string user_currency ; 
} 

ここに私がアクセスしたいクラスがあります。

namespace OctopartApi 
{ 
    using Newtonsoft.Json; 
    using RestSharp; 
    using System; 
    using System.Collections; 
    using System.Collections.Generic; 
    using UnityEngine; 
    using UnityEngine; 
    using System.Net; 
using UnityEngine.UI; 
public class KeywordSearch1 : MonoBehaviour 
{ 
    public InputField mainInputField; 
    public Canvas can; 
    public Text parts,package,pin,dersc; 
    public float x, y; 
    void Start() { 
     mainInputField.onEndEdit.AddListener(delegate {LockInput(mainInputField); }); 

    } 
    void LockInput(InputField input) 
    { 
     ExecuteSearch (input.text); 

    } 
    public void ExecuteSearch(string inp) 
    { 
     // -- your search query -- 
     string query = inp; 

     string octopartUrlBase = "http://octopart.com/api/v3"; 
     string octopartUrlEndpoint = "parts/search"; 
     string apiKey = "57af648b"; 

     // Create the search request 

     var client = new RestClient(octopartUrlBase); 
     var req = new RestRequest(octopartUrlEndpoint, Method.GET) 
        .AddParameter("apikey", apiKey) 
        .AddParameter("q", query) 
        .AddParameter("start", "0") 
        .AddParameter("limit", "10"); 
     var resp = client.Execute(req); 
     string octojson = resp.Content; 
     RootOb rr = JsonUtility.FromJson<RootOb> (octojson); 
     Debug.Log (rr.hits); 
     printingPress (rr.results); 
     parts.horizontalOverflow = HorizontalWrapMode.Wrap; 
     parts.verticalOverflow = VerticalWrapMode.Overflow; 
    } 
    public void printingPress(List<Result> reslt) 
    { 
     for (var i = 0; i < reslt.Count; i++) { 
      parts.text = parts.text+reslt [i].item.brand.name+"\n"; 
     } 
    } 
    private const string APIKEY = "57af648b"; 
} 
} 

私のJSONはそうここに掲載するには大きすぎる、ここではそれへのリンクは次のとおりです。https://octopart.com/api/docs/v3/search-tutorial

答えて

0

ただ、今後の参考のために、あなたはOfferは最初から下に行くその後、宣言されている場所を調べることでこれを見つけることができますそこ。

選択図Offerクラスはpublic List<Offer> offers;としてItemクラス内で宣言されています。

選択図Itemクラスは、public Item item;としてResultクラス内で宣言されています。

.Finally、Resultクラスは、公開List<Result> results;としてRootObクラス内で宣言されています。

これを見つけたら、それを逆にしてOfferクラスにアクセスできます。 #3から#1に戻る。


RootOb rr = JsonUtility.FromJson<RootOb>(octojson); 

#3List<Result> result = rr.results;

#2Item item = result[0].item;

Listであるため、Resultが複数存在することがあります。 result.Countを使用して、アクセスする前にどれくらい多くのItemをチェックしていますか。

Item item1 = result[0].item;

Item item2 = result[1].item;

Item item3 = result[2].item;

#1Offer offer = item.offers[0];

Listであるため、Offerが複数ある可能性があります。 item.offers.Countを使用して、アクセスする前に何個確認します。

Offer offer1 = item.offers[0];

Offer offer2 = item.offers[1];

Offer offer3 = item.offers[2];


繰り返しますが、それだけでこれです:

最後に、これは最高のforループで行われ
RootOb rr = JsonUtility.FromJson<RootOb>(octojson); 
List<Result> result = rr.results; 
Item item = result[0].item; 
Offer offer = item.offers[0]; 

RootOb rr = JsonUtility.FromJson<RootOb>(octojson); 
List<Result> result = rr.results; 
//Loop through the Results List 
for (int i = 0; i < result.Count; i++) 
{ 
    //Get each item 
    Item item = result[i].item; 
    Debug.Log("Item Index: " + i + "... mpn: " + item.mpn); 

    //Loop through the Offer List 
    for (int j = 0; j < item.offers.Count; j++) 
    { 
     //Get each offer 
     Offer offer = item.offers[j]; 
     Debug.Log("Offer Index: " + j + ".... quantity: " + offer.in_stock_quantity); 
    } 
} 
+0

大丈夫です。私はあなたに借りができた :)。どうもありがとう。 。私は今それを試してみる –

+0

YEs、それは 'result.count'です。私は内側のループで間違いを犯しました。これは 'item.offers.Count'でなければなりません。最後のループサンプルで私のEDITを参照してください。そのループコードにさらにコメントを追加しました。 – Programmer

+0

今、完璧に動作します:) –

関連する問題