Некоторые вопросы, касающиеся JavaScriptSerializer - PullRequest
1 голос
/ 11 ноября 2010
  1. При использовании JavaScriptSerializer для выполнения сериализации можно ли игнорировать некоторые поля класса?

  2. При использовании JavaScriptSerializer для выполнения сериализации можно ли изменитьназвание поля?Например, поле является строкой is_OK, но я хочу, чтобы оно было сопоставлено с isOK?

Ответы [ 3 ]

12 голосов
/ 11 ноября 2010

Вы можете использовать [ScriptIgnore] , чтобы пропустить свойство:

using System;
using System.Web.Script.Serialization;

public class Group
{
    // The JavaScriptSerializer ignores this field.
    [ScriptIgnore]
    public string Comment;

    // The JavaScriptSerializer serializes this field.
    public string GroupName;
}
6 голосов
/ 11 ноября 2010

Для большей гибкости (поскольку вы также упоминаете имена), в идеале нужно вызвать RegisterConverters для объекта JavaScriptSerializer, регистрируя одну или несколько реализаций JavaScriptConverter (возможно, в массиве или блоке итератора).

Затем можно реализовать Serialize для добавления (или нет) и значений под любыми именами, добавляя пары ключ / значение в возвращаемый вами словарь.Если данные двунаправленные, вам также потребуется соответствующий Deserialize, но часто (для серверов ajax) это не требуется.

Полный пример:

using System;
using System.Collections.Generic;
using System.Web.Script.Serialization;
class Foo
{
    public string Name { get; set; }
    public bool ImAHappyCamper { get; set; }
    private class FooConverter : JavaScriptConverter
    {
        public override object Deserialize(System.Collections.Generic.IDictionary<string, object> dictionary, System.Type type, JavaScriptSerializer serializer)
        {
            throw new NotImplementedException();
        }
        public override System.Collections.Generic.IEnumerable<System.Type> SupportedTypes
        {
            get { yield return typeof(Foo); }
        }
        public override System.Collections.Generic.IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
        {
            var data = new Dictionary<string, object>();
            Foo foo = (Foo)obj;
            if (foo.ImAHappyCamper) data.Add("isOk", foo.ImAHappyCamper);
            if(!string.IsNullOrEmpty(foo.Name)) data.Add("name", foo.Name);
            return data;
        }
    }
    private static JavaScriptSerializer serializer;
    public static JavaScriptSerializer Serializer {
        get {
            if(serializer == null) {
                var tmp = new JavaScriptSerializer();
                tmp.RegisterConverters(new [] {new FooConverter()});
                serializer = tmp;
            }
            return serializer;
        }
    }
}
static class Program {
    static void Main()
    {
        var obj = new Foo { ImAHappyCamper = true, Name = "Fred" };
        string s = Foo.Serializer.Serialize(obj);
    }
}
0 голосов
/ 23 апреля 2018

Я бы использовал анонимные типы, чтобы сохранить полученный JSON чистым.

class SomeClass {
   public string WantedProperty { get; set; }
   public string UnwantedProperty { get; set; }
}

var objects = new List<SomeClass>();

...

new JavaScriptSerializer().Serialize(
   objects
   .Select(x => new {
      x.WantedProperty
   }).ToArray()
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...