2

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

bar.foo({ bar: 19 })

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

public sealed class Bar
{
    public void Foo(JsonObject jsonObject)
    {

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

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

4

3 回答 3

1

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

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

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

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

于 2012-02-08T18:38:02.297 回答
0

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

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

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 字符串。

bar.foo("{ \"bar\": 19 }");

对于具有很多字段的对象,这可能会很耗时并且会导致代码难看。您最好的选择是在对象上调用 JSON.stringify 以将其转换为字符串。

bar.foo(JSON.stringify({ bar: 19 }));

或者,您当然可以为您创建一些调用 JSON.stringify 的包装器方法。无论哪种方式最适合您的情况。

于 2013-01-03T20:28:29.713 回答
-1

我也在 Windows 8 上启动,早上大部分时间都在解析 JSON。 这个链接让我可以将我的 JSON 字符串反序列化为 Windows.Data.Json.JsonObject。

这是我结束的代码:

        HttpResponseMessage response = await Client.SendAsync(RequestMessage);
        response.EnsureSuccessStatusCode();
        string json = response.Content.ReadAsString();
        ResponseObject = new JsonObject(json);

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

于 2012-02-01T23:16:00.803 回答