2017-09-07 54 views
0

我使用unity3d,我有一个JSON对象。我可以使用ob.name等访问每个成员,但我希望在运行时将这个反序列化的块打印在屏幕上。类似于搜索结果,因此我得到了JSON作为搜索结果我想在屏幕上显示它。我得到的错误是我无法打印对象,因为我使用了(ob.name)toString(); 我不确定如何在运行时在屏幕上显示此信息。打印JSON到屏幕作为一个团块中的文本块

ObjR rs = JsonUtility.FromJson<ObjR>(jsonString); 
//so now I want to print to screen each element of rs.How do I do that during runtime. 

编辑:我能看到的debug.log,我只需要动态上打印他们screen.Please说明,大小或结果的数量是在运行时,将vary.Any帮助表示赞赏。所以我找到了这个,现在我在屏幕上获得它。 http://wiki.unity3d.com/index.php/DebugConsole.Can任何人都可以帮助我如何使每个响应点击事件?

var client = new RestClient(Url); 
var req = new RestRequest(UrlEndpoint, Method.GET) 
      .AddParameter("apikey", apiKey) 
      .AddParameter("q", query) 

    // Perform the search and obtain results 
var resp = client.Execute(req); 
var search = JsonConvert.DeserializeObject<dynamic>(resp.Content); 

// Print the number of results 
Console.WriteLine("Number of hits: " + search["hits"]); 
Debug.Log(search["hits"] + " "); 
foreach (var result in search["results"]) 
{ 
    var part = result["item"]; 
    // want to print to screen each item and mpn 
    //Debug.Log(part["brand"]["name"] + " " + part["mpn"]); 
    //what i tried/ string hits = search["hits"].ToString();//error 

    //expected type object and found string 
    GUILabel(float,float,needed string here); 
} 
+0

你从哪里得到这个错误吗?请张贴您的其他代码,并告诉我们错误在哪里。 – Programmer

+0

@Programmer我试图在运行时创建一个GUIText,但它需要传递一个字符串。所以我想将search [“hits”]转换为一个字符串。但是出现一个错误。所以我的目标是打印我所有的结果在屏幕上。 –

+0

您需要使用JsonUtility。请张贴你的json的样子,我会告诉你如何打印它。 – Programmer

回答

0

问题是,当您使用var search = JsonConvert.DeserializeObject<dynamic>(resp.Content);时,您并未将其反序列化为特定对象,并且很难打印出您的json。

如果您知道Json的外观,请使用this将其转换为您可以轻松用于在屏幕上显示Json的对象。请注意,您必须删除{ get; set; }并将[Serializable]添加到每个生成的类的顶部,如here所述。

有了这些生成的类,我们也可以将收到的JSON来对象

//Convert Json to Object so that we can print it 
string yourJsonFromServer = resp.Content;//Replace with Json from the server 
RootObject rootObj = JsonUtility.FromJson<RootObject>(yourJsonFromServer); 

现在,串联需要显示的所有字符串。

string dispStr; 
dispStr = "__class__: " + rootObj.__class__ + "\r\n"; 
dispStr = dispStr + "mpn:" + rootObj.mpn + "\r\n"; 
dispStr = dispStr + "uid:" + rootObj.uid + "\r\n"; 

//manufacturer info 
dispStr = "Manufacturer __class__: " + rootObj.manufacturer.__class__ + "\r\n"; 
dispStr = "Manufacturer homepage_url: " + rootObj.manufacturer.homepage_url + "\r\n"; 
dispStr = "Manufacturer name: " + rootObj.manufacturer.name + "\r\n"; 
dispStr = "Manufacturer uid: " + rootObj.manufacturer.uid + "\r\n"; 

最后,使用Text组件来显示它们。一个Text组件就足够了。只要使用“\r\n”将它们分开:

public Text infoText; 
... 
infoText.horizontalOverflow = HorizontalWrapMode.Overflow; 
infoText.verticalOverflow = VerticalWrapMode.Overflow; 
infoText.text = dispStr; 

对于列表或数组中的项目,你可以使用for循环完了完了并显示出来。

string dispStr = ""; 
for (int i = 0; i < rootObj.offers.Count; i++) 
{ 
    dispStr = dispStr + "SKU: " + rootObj.offers[i].sku + "\r\n"; 
    dispStr = dispStr + "REGION: " + rootObj.offers[i].eligible_region + "\r\n\r\n\r\n"; 
} 
infoText.text = dispStr; 

完整的例子:

public Text infoText; 

void Start() 
{ 
    //Convert Json to Object so that we can print it 
    string yourJsonFromServer = resp.Content;//Replace with Json from the server 
    RootObject rootObj = JsonUtility.FromJson<RootObject>(yourJsonFromServer); 

    string dispStr; 

    dispStr = "__class__: " + rootObj.__class__ + "\r\n"; 
    dispStr = dispStr + "mpn:" + rootObj.mpn + "\r\n"; 
    dispStr = dispStr + "uid:" + rootObj.uid + "\r\n"; 

    //Example, Show manufacturer info 
    dispStr = "Manufacturer __class__: " + rootObj.manufacturer.__class__ + "\r\n"; 
    dispStr = "Manufacturer homepage_url: " + rootObj.manufacturer.homepage_url + "\r\n"; 
    dispStr = "Manufacturer name: " + rootObj.manufacturer.name + "\r\n"; 
    dispStr = "Manufacturer uid: " + rootObj.manufacturer.uid + "\r\n"; 

    //Display 
    infoText.horizontalOverflow = HorizontalWrapMode.Overflow; 
    infoText.verticalOverflow = VerticalWrapMode.Overflow; 
    infoText.text = dispStr; 
} 

生成的类:

[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>> INR; 
} 

[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 object 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 object on_order_eta; 
    public int? on_order_quantity; 
    public object order_multiple; 
    public object packaging; 
    public Prices prices; 
    public string product_url; 
    public Seller seller; 
    public string sku; 
} 

[Serializable] 
public class RootObject 
{ 
    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; 
} 
+0

哇,我真的很感激它。它的工作原理。所以,只有最后一个疑问,所以要访问制造商类。我该怎么办? //我所尝试的是 - var resp = client.Execute(req); \t \t \t string octojson = resp.Content; \t \t \t RootObject objR = JsonUtility.FromJson (octojson); \t \t \t string hey = objR.hits; \t \t \t价格hh = JsonUtility.FromJson (octojson); //错误找不到价格 –

+0

它始终是'RootObject objR = JsonUtility.FromJson (octojson);'而没有别的。然后你可以从'objR'变量中访问其余的数据。我甚至在例子中这样做了......'rootObj.manufacturer'或者'制造商制造商= rootObj.manufacturer' ...现在,你可以使用他'制造商'变量来访问它的值,比如'manufacturer.uid'。 .... – Programmer

+0

好吧,明白了!它只是我有很多在我脑中运行,现在我有两个这样的类(因为我发射另一个请求,并得到一个JSON,不同的领域),所以由于某种原因,只有该类的rootobjects被访问,而不是新的。我实际上改变了一个“Root”和一个“RootObject”,仍然只有Root被系统识别。奇怪。 –

0

如果你想用这个JSON一些调试输出 - 这将是更容易使用GUI.Label。这很容易设置,并且您可以根据字符串中的行数或字符数来管理标签的大小。但由于性能不佳,这绝对不适合生产。

另一个简单的方法是创建Unity UI画布并添加一个包含Text元素的面板。文本元素具有Best Fit属性,它允许您为标签设置最小和最大字体大小。因此,字体的大小将自动计算,以使文本适合文本元素的大小。 enter image description here 为了接收文本元素上的点击事件,您还可以添加一个Button元素。