解析统一WWW api对模型的回应

时间:2015-01-23 12:59:21

标签: c# parsing unity3d

如何将我的webapi响应解析为有用的模型?

这是我的api电话:

  IEnumerator GetQuestion(){
    string input = new QuestionThemeRequest(){ QuestionTheme = "BAJS" }.ToString();
    Hashtable headers = new Hashtable();
    headers.Add("Content-Type", "application/json");
    byte[] body = Encoding.UTF8.GetBytes (input);
    WWW www = new WWW ("http://localhost:52603/api/Question/GetRandomQuestionByTheme", body, headers);
    yield return www;
}

在这里

   public class Question{
    public int Id { get; set; }
    public string Answere { get; set; }
}
我试过这样的事情:

Question q = new Question();
q = GetQuestion();

但这似乎不起作用。

2 个答案:

答案 0 :(得分:1)

它基于服务器响应的内容。

如果它是JSON,您可以使用SimpleJSON来解析它。

@MX D解决了您的延迟问题。

这是示例代码但不要忘记我假设您的www.text是JSON类型。

using SimpleJSON;

IEnumerator GetQuestion(){
    string input = new QuestionThemeRequest(){ QuestionTheme = "BAJS" }.ToString();
    Hashtable headers = new Hashtable();
    headers.Add("Content-Type", "application/json");
    byte[] body = Encoding.UTF8.GetBytes (input);
    WWW www = new WWW ("http://localhost:52603/api/Question/GetRandomQuestionByTheme", body, headers);
    yield return www;
    if((!string.IsNullOrEmpty(www.error))) {
       print( "Error downloading: " + www.error );
    } else {
       JSONNode questionJSON = JSONNode.Parse (www.text);
       Question q = new Question();
       q.Id = questionJSON["id"];
       q.Answere = questionJSON["Answere"];
    }
}

更好的解决方案是

using SimpleJSON;

public YourClass : MonoBehaviour{
    public delegate void WWWCalback(WWW wwwData);
    private void answersCallback(WWW wwwData){
        JSONNode questionJSON = JSONNode.Parse (wwwData.text);
        Question q = new Question();
        q.Id = questionJSON["id"];
        q.Answere = questionJSON["Answere"];
    }
    private void getAnswers(){
      StartCoroutine(GetQuestion(answersCallback));
    }
    IEnumerator GetQuestion(WWWCalback callback){
      string input = new QuestionThemeRequest(){ QuestionTheme = "BAJS" }.ToString();
      Hashtable headers = new Hashtable();
      headers.Add("Content-Type", "application/json");
      byte[] body = Encoding.UTF8.GetBytes (input);
      WWW www = new WWW ("http://localhost:52603/api/Question/GetRandomQuestionByTheme", body, headers);
      yield return www;
      if((!string.IsNullOrEmpty(www.error))) {
            print( "Error downloading: " + www.error );
      } else {
            callback(www);
      }
    }
}
像那样。可能会出现一些语法或其他问题。我不检查它。

答案 1 :(得分:0)

您提供的代码无法运行,因为您试图将其称为无效代码。但它是一个Coroutine(IEnumerator)。为了正确运行,您需要启动协同程序,可以按照以下步骤进行操作

StartCoroutine(GetQuestion());

StartCoroutine("GetQuestion");

请记住,从5.0开始,第二个选项将不再可行

有关协同程序的更多信息,请查看unity docs