我正在创建一个winmd文件,以便在Windows 8开发中使用。我想要有一个很棒的JavaScript (WinJS)体验,但是不知道如何使用除了原始JSON之外的方法,例如,我希望开发人员在WinJS中像这样编写代码:
bar.foo({ bar: 19 })在我的C#库中,我会有类似这样的东西
public sealed class Bar
{
public void Foo(JsonObject jsonObject)
{这段代码可以编译,但是当我尝试从WinJS调用foo时,我得到一个错误,指出该方法的签名无效。我猜想这是因为它公开了一个“托管”类型的Windows.Data.Json.JsonObject。
任何关于如何使用JSON的想法都是从WinJS世界传递到.NET (在WinMD中)的。
发布于 2012-02-09 02:38:02
我认为这是不可能的,至少在开发者预览版中是不可能的。
我创建了一个C#方法,它有一个object参数,并假定任何可以通过WinRT从JS表单转换为.Net表单的对象都可以通过。
它适用于数组: JS数组将作为object[]传入。但是如果我试图传递一个JSON对象,就会抛出一个“类型不匹配”的错误。这就是为什么我认为这是不可能的。
我也尝试过使用the WinJS.Class.define() function创建对象,但也不起作用。
发布于 2013-01-04 04:28:30
这已经快一年了,但对于其他遇到同样问题的人来说……
这是可以做到的,但是您需要让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。最适合你的情况。
发布于 2012-02-02 07:16:01
我也是在Windows8上启动的,早上的大部分时间我都在努力解析JSON。This link让我可以将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,并且看不到获得任何诊断信息的方法。
https://stackoverflow.com/questions/9048799
复制相似问题