Как заставить JavaScriptSerializer обрабатывать подобъект как простую старую строку? - PullRequest
3 голосов
/ 17 февраля 2011

JSON входит в мою программу следующим образом:

{
    "Foo": "some string",
    "Bar": { "Quux" : 23 }
}

Как я могу использовать JavaScriptSerializer для анализа этого, , но обрабатывать значение Bar как строку вместосубобъект?Код ниже выдает исключение, как и ожидалось.

После десериализации я хочу, чтобы thing.Bar содержал строку { "Quux" : 23 }.Есть ли простой способ сделать это?

class Thing
{
    public string Foo { get; set; }
    public string Bar { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        string json = "{ \"Foo\": \"some string\", \"Bar\": { \"Quux\": 23 }}";
        var serializer = new JavaScriptSerializer();
        var thing = serializer.Deserialize<Thing>(json);
    }
}

Ответы [ 2 ]

1 голос
/ 17 февраля 2011

Вы хотите реализовать собственный JavaScriptConverter для этого ... вот пример ...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Web.Script.Serialization;
using System.Collections.ObjectModel;

namespace ConsoleApplication1
{
    [Serializable]
    public class Thing
    {
        public string Foo { get; set; }
        public string Bar { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var json = "{\"Foo\":\"some string\",\"Bar\":{\"Quux\":23}}";
            var serializer = new JavaScriptSerializer();
            serializer.RegisterConverters(new JavaScriptConverter[] {
                new StringConverter()           
            });
            var thing = serializer.Deserialize<Thing>(json);

            Console.WriteLine(thing.Bar);
        }
    }

    public class StringConverter : JavaScriptConverter
    {
        public override IEnumerable<Type> SupportedTypes
        {
            get { return new ReadOnlyCollection<Type>(new List<Type>(new Type[] { typeof(string) })); }
        }

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

        public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
        {
            var i = dictionary.First();
            return "{ \"" + i.Key + "\" : " + i.Value + " }";
        }
    }
}
0 голосов
/ 17 февраля 2011

Вы пробовали содержимое бара в кавычках?

{
    "Foo": "some string",
    "Bar": "{ 'Quux' : 23 }"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...