首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C# winmd中使用JSON

在C# winmd中使用JSON
EN

Stack Overflow用户
提问于 2012-01-29 05:31:05
回答 3查看 2.1K关注 0票数 2

我正在创建一个winmd文件,以便在Windows 8开发中使用。我想要有一个很棒的JavaScript (WinJS)体验,但是不知道如何使用除了原始JSON之外的方法,例如,我希望开发人员在WinJS中像这样编写代码:

代码语言:javascript
复制
bar.foo({ bar: 19 })

在我的C#库中,我会有类似这样的东西

代码语言:javascript
复制
public sealed class Bar
{
    public void Foo(JsonObject jsonObject)
    {

这段代码可以编译,但是当我尝试从WinJS调用foo时,我得到一个错误,指出该方法的签名无效。我猜想这是因为它公开了一个“托管”类型的Windows.Data.Json.JsonObject。

任何关于如何使用JSON的想法都是从WinJS世界传递到.NET (在WinMD中)的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-09 02:38:02

我认为这是不可能的,至少在开发者预览版中是不可能的。

我创建了一个C#方法,它有一个object参数,并假定任何可以通过WinRT从JS表单转换为.Net表单的对象都可以通过。

它适用于数组: JS数组将作为object[]传入。但是如果我试图传递一个JSON对象,就会抛出一个“类型不匹配”的错误。这就是为什么我认为这是不可能的。

我也尝试过使用the WinJS.Class.define() function创建对象,但也不起作用。

票数 1
EN

Stack Overflow用户

发布于 2013-01-04 04:28:30

这已经快一年了,但对于其他遇到同样问题的人来说……

这是可以做到的,但是您需要让winmd方法签名接受一个字符串作为参数,然后使用静态JsonObject.Parse解析JSON文本。

代码语言:javascript
复制
public sealed class Bar
{
    public void Foo(string json)
    {
        if (!String.IsNullOrEmpty(json))
        {
            var jobj = JsonObject.Parse(json);
            var barVal = jobj.GetNamedNumber("bar");
            // if all went well, barVal should be a double value of 
            // the number passed in the object (19.0 based on the original question).
        }                 
    }
}

但是,在调用此方法时,需要用引号将对象定义括起来,使其成为字符串。您还需要将字段名括在引号中,否则JsonObject.Parse将抛出异常,说明该字符串不是有效的JSON字符串。

代码语言:javascript
复制
bar.foo("{ \"bar\": 19 }");

对于一个有很多字段的对象,这可能很耗时,并且会导致丑陋的代码。更好的方法是在对象上调用JSON.stringify,将其转换为字符串。

代码语言:javascript
复制
bar.foo(JSON.stringify({ bar: 19 }));

当然,您也可以创建一些包装器方法来为您调用JSON.stringify。最适合你的情况。

票数 0
EN

Stack Overflow用户

发布于 2012-02-02 07:16:01

我也是在Windows8上启动的,早上的大部分时间我都在努力解析JSON。This link让我可以将JSON字符串反序列化为Windows.Data.Json.JsonObject。

以下是我最终使用的代码:

代码语言:javascript
复制
        HttpResponseMessage response = await Client.SendAsync(RequestMessage);
        response.EnsureSuccessStatusCode();
        string json = response.Content.ReadAsString();
        ResponseObject = new JsonObject(json);

如果您想反序列化为您自己的数据类型,可以尝试System.Runtime.Serialization.Json.DataContractJsonSerializer.我没有那么幸运;我一直从ReadObject()方法返回null,并且看不到获得任何诊断信息的方法。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9048799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档