在 C# winmd 中使用 JSON

发布于 2024-12-29 16:38:22 字数 461 浏览 1 评论 0原文

我正在创建一个用于 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 的任何想法。

I'm creating a winmd file for use in Windows 8 development. I want to have a great JavaScript (WinJS) experience but can't work out how to have my methods except raw JSON, for example I would like developers to code like this in WinJS:

bar.foo({ bar: 19 })

And inside my C# library I would have something like this

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

This compiles but when I try to call foo from WinJS I get an error saying the signature of the method is invalid. I'm assuming this is because it exposes a 'managed' type Windows.Data.Json.JsonObject.

Any ideas how I can work with JSON passed from the WinJS world into .NET (within a WinMD).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

孤单情人 2025-01-05 16:38:22

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

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

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

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

I think it's not possible, at least in the Developer Preview.

I created a C# method that has an object parameter with the assumption that any object that can be converted from JS form to .Net form through WinRT will be able to go through.

And it works for arrays: a JS array will be passed in as object[]. But if I try to pass a JSON object, a “Type mismatch” error is thrown. This is why I think it's not possible.

I also tried object created using the WinJS.Class.define() function, but that didn't work either.

北渚 2025-01-05 16:38:22

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

这是可以完成的,但是您需要让您的 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 的包装方法。无论哪种方式最适合您的情况。

This is almost a year old, but for anyone else encountering the same issue...

This can be done, but you need to make your winmd method signature takes in a string as a parameter and then use the static JsonObject.Parse parse the JSON text.

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).
        }                 
    }
}

When you call this method, though, you need to wrap the object definition in quotes to make it a string. You also need to wrap the field names in quotes or JsonObject.Parse will throw an exception saying the string is not a valid JSON string.

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

For an object with a lot of fields, this could be time consuming and result in ugly code. Your better bet is to call JSON.stringify on the object to convert it to a string.

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

Or you could, of course, make some wrapper method that call JSON.stringify for you. Whatever works best for your situatiuon.

指尖上得阳光 2025-01-05 16:38:22

我也开始使用 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,但没有找到获取任何诊断信息的方法。

I'm starting up on Windows 8 also and struggled much of the morning with parsing JSON. This link got me to the point where I could deserialize my JSON string into a Windows.Data.Json.JsonObject.

Here's the code I wound up with:

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

If you want to deserialize into your own data types, you could try System.Runtime.Serialization.Json.DataContractJsonSerializer. I didn't have a lot of luck with that; I kept getting back null from the ReadObject() method and didn't see a way to get any diagnostic information.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文