0

我正在使用在线教程来学习如何创建 Web 服务、生成 JSON 对象、将其发送回我的 Win 8 应用程序并显示它。Web 服务正在运行,但是我正在努力将值返回给 APP。我在应用程序中的代码是:

 WinJS.xhr({                         
         url: 'http://localhost/filmgloss/web-service.php?termID=1&format=JSON'
     })
         .done(
            function complete(result) {

                // terms is the key of the object
                for (var terms in result) {

                    for (var term in terms) {


                        if (result.hasOwnProperty(term)) {
                            //here you have to acess to
                            var termName = result[term].termName;
                            var def = result[term].definition;
                        }
                        //Show Terms                 
                        testDef.innerText = definition;
                    }
                }
            },

他在我的网络服务中的代码是:

if($format == 'json') {
   header('Content-type: application/json');
   echo json_encode(array('terms'=>$terms));
}else...

JSON 输出本身如下所示:

    {"terms":[{"term":{ "termName":"Focus","definition":"A Focus..."}}]}

我正在使用一个for..in但我可以查看内部terms' I can't work out how to look in术语

4

2 回答 2

0

我通常构建自己的数据结构来表示 JSON 结构。
在你的情况下,它会是这样的:

public class TermsList
{
    public List<Term> terms { get; set; } 
}

public class Term
{
    public string termName { get; set }
    public definition termName { get; set }
    ...
}

然后你可以将你的字符串反序列化到你的对象中。有不同的方法可以做到这一点。我会使用 Json.Net。
这是一种方法:
在 C# 中解析 JSON

public static T Deserialise<T>(string json)
{
    T obj = Activator.CreateInstance<T>();
    using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
    {
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
        obj = (T)serializer.ReadObject(ms); // <== Your missing line
        return obj;
    } 
}

如果你想让它保持动态,那也应该工作:

http://www.drowningintechnicaldebt.com/ShawnWeisfeld/archive/2010/08/22/using-c-4.0-and-dynamic-to-parse-json.aspx

于 2012-11-16T08:30:04.053 回答
0

在开发人员朋友的帮助下,我设法解决了我的问题。我的问题是我没有意识到结果WinHS.xhr还不是 JSON 数组。尽管我的 Web 服务在通过它使用时输出一个 JSON 数组,但WinHS.xhr它似乎是作为一个XMLHttpRequest对象返回的。

因此,解决方案是使用以下方法处理结果:

JSON.parse(result.responseText)

然后我可以按预期使用For...In循环:

  for (terms in responseTerms) {

             //terms will find key "terms"
             var termName = responseTerms.terms[0].term.termName;
             var termdefinition = responseTerms.terms[0].term.definition;

             testTerm.innerText = termName;
             testDef.innerText = termdefinition;

         }

感谢所有评论的人,如果他们开始使用 Win 8 应用程序开发,希望这可以帮助其他人。

于 2012-11-16T11:26:17.963 回答