2016-09-20 5 views
1

У меня есть рабочий стол , который использует класс JavaScriptSerializer для декодирования некоторого количества JSON, возвращаемого веб-приложением MediaWiki. Это было в основном довольно легко понять, но есть конкретный ответ JSON, который включает в себя «*» как одно из имен полей, и я не знаю, что с ним делать.Как десериализовать строку JSON со свойством «*»?

Вот некоторые примеры JSON:

{ 
    "warnings": { 
     "login": { 
      "result": "OK", 
      "*": "blah blah blah" 
     } 
    } 
} 

Я создал rLogin класс, чтобы содержать результаты для login подобъекта, и в этом классе я создал строковый enter code here объект для result, но я не» я знаю, что делать для другой области. Очевидно, я не могу создать поле в своем классе с именем *, так как можно получить значение?

+0

Действительно ли ключ «результат» отсутствует в кавычках в реальном файле или это только опечатка в примере вопроса? –

+0

О, это была просто опечатка .. извините. На самом деле не существует поля результата ... Я просто добавил это как пример другого поля, для которого я добавил строковый объект. –

ответ

2

Вам необходимо создать JavaScriptConverter.

Класс JavaScriptConverter позволяет реализовать сериализацию и десериализации процессов для управляемых типов, которые изначально не поддерживаются классом JavaScriptSerializer.

Это не самый простой из-за гнездования, но я опрокинул грубую и успешно проверил его в Linqpad. Соответствующая часть здесь наша реализация Deserialize():

public class ResultConverter : JavaScriptConverter 
{ 
    private static readonly IEnumerable<Type> supportedTypes = new List<Type> { typeof(Warnings) }; 

    public override IEnumerable<Type> SupportedTypes => supportedTypes; 

    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) 
    { 
     var warningsDictionary = dictionary["warnings"] as IDictionary<string, object>; 
     var loginDictionary = warningsDictionary["login"] as IDictionary<string, object>; 

     var login = new Login 
     { 
      Result = loginDictionary["result"] as string, 
      Details = loginDictionary["*"] as string, 
     }; 

     return new Warnings { Login = login }; 
    } 

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Вспомогательные классы и использование:

void Main() 
{ 
    string json = @"{ ""warnings"": { ""login"": { result: ""OK"", ""*"": ""blah blah blah"" } } }"; 

    var js = new JavaScriptSerializer(); 
    js.RegisterConverters(new List<JavaScriptConverter> { new ResultConverter() }); 
    var result = js.Deserialize<Warnings>(json); 
    Console.WriteLine(result); 
} 

public class Login 
{ 
    public string Result { get; set; } 
    public string Details { get; set; } 
} 

public class Warnings 
{ 
    public Login Login { get; set; } 
} 

В нашей продукции мы теперь имеем «бла-бла-бла» в Details собственности.

 Смежные вопросы

  • Нет связанных вопросов^_^