Работа с JSON внутри C # winmd - PullRequest
2 голосов
/ 29 января 2012

Я создаю файл winmd для использования в разработке под Windows 8. Я хочу иметь большой опыт работы с JavaScript (WinJS), но не могу понять, как использовать мои методы, кроме необработанного JSON, например, я хотел бы, чтобы разработчики писали такой код в WinJS:

bar.foo({ bar: 19 })

А внутри моей библиотеки C # у меня будет что-то вроде этого

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

Это компилируется, но когда я пытаюсь вызвать foo из WinJS, я получаю сообщение о том, что подпись метода недействительна. Я предполагаю, что это потому, что он предоставляет «управляемый» тип Windows.Data.Json.JsonObject.

Любые идеи о том, как я могу работать с JSON, передаются из мира WinJS в .NET (в WinMD).

Ответы [ 3 ]

1 голос
/ 08 февраля 2012

Я думаю, что это невозможно, по крайней мере, в Preview для разработчиков.

Я создал метод C # с параметром object, предполагая, что любой объект, который можно преобразовать из формы JS в форму .Net через WinRT, сможет пройти.

И это работает для массивов: массив JS будет передан как object[]. Но если я пытаюсь передать объект JSON, выдается ошибка «Несоответствие типов». Вот почему я думаю, что это невозможно.

Я также пытался создать объект, созданный с использованием функции WinJS.Class.define() , но это тоже не сработало.

0 голосов
/ 04 января 2013

Это почти год, но для тех, кто сталкивается с той же проблемой ...

Это можно сделать, но вам нужно, чтобы ваша сигнатура метода 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 для вас. Все, что лучше всего подходит для вашей ситуации.

0 голосов
/ 02 февраля 2012

Я тоже запускаю Windows 8 и большую часть утра боролся с разбором JSON. Эта ссылка подтолкнула меня к тому, что я могу десериализовать мою строку JSON в объект Windows.Data.Json.JsonObject.

Вот код, с которым я справился:

Если вы хотите десериализовать в свои собственные типы данных, вы можете попробовать System.Runtime.Serialization.Json.DataContractJsonSerializer.Мне не повезло с этим;Я продолжал возвращать ноль из метода ReadObject () и не видел способа получить какую-либо диагностическую информацию.

...