2017-09-09 50 views
0

我收到一个JSON以响应请求。我可以访问简单变量并在屏幕上打印它们。但我不确定如何访问深层变量并将其打印出来我想要访问“Offers”类中的变量。我该如何去解决它? 这是我的模特班。如何访问此深度嵌套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是太大所以张贴在这里,这里是一个链接:通过查看哪里Offer首先宣告然后再从下https://octopart.com/api/docs/v3/search-tutorial

回答

0

只是为了将来参考,你可以找到这个那里。

.The Offer类的Item类作为public List<Offer> offers;内部声明。

.The Item类的Result类作为public Item item;内部声明。

。最后,该Result类的RootOb类公共List<Result> results;内部声明。

找到后,您可以通过反转来访问Offer类。从#3回到#1


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

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

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

可以有多个Result,因为它是List。您可以使用result.Count来检查在访问它们之前有多少Item

Item item1 = result[0].item;

Item item2 = result[1].item;

Item item3 = result[2].item;

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

可以有多个Offer,因为它是List。在使用它们之前,您使用item.offers.Count来检查多少个。

Offer offer1 = item.offers[0];

Offer offer2 = item.offers[1];

Offer offer3 = item.offers[2];


再次,它仅仅是这样的:

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

YE,它它'result.count'。我在内循环中犯了一个错误。这应该是'item.offers.Count'。在最后一个循环示例中查看我的编辑。为该循环代码添加了更多评论。 – Programmer

+0

耶现在完美:) –