Как не сериализировать __, вводят свойство на объектах JSON

Простейшим способом было бы использовать select qty wavg price from t, однако замена select на exec вернет атомное значение, а не таблицу, которая может лучше удовлетворить ваши потребности

exec qty wavg price from t

wavg вычислил средневзвешенная цена

62
задан Stephen Kennedy 22 December 2017 в 12:37
поделиться

4 ответа

Я обнаружил, что если я сделаю конструктор по умолчанию для моего класса, то мой веб-метод возвращает что-либо, кроме public, он не будет сериализовать часть __ type: ClassName .

Вы можете объявить ваш конструктор по умолчанию внутренним защищенным ClassName () {}

38
ответ дан 24 November 2019 в 16:50
поделиться

Не используйте атрибут [Serializable].

Следующее должно просто сделать это

JavaScriptSerializer ser = new JavaScriptSerializer (); string json = ser.Serialize (objectClass);

1
ответ дан 24 November 2019 в 16:50
поделиться

Я не уверен, что это хорошее решение, но если вы используете библиотеку Json.net , вы можете игнорировать некоторые свойства, добавив атрибут [JsonIgnore].

2
ответ дан 24 November 2019 в 16:50
поделиться

Это должно решить проблему.

В частном методе SerializeValue метода JavaScriptSerializer в System.WebExtensions.dll, __type добавляется во внутренний словарь, если он может быть разрешен.

Из Reflector:

private void SerializeValue(object o, StringBuilder sb, int depth, Hashtable objectsInUse)
{
    if (++depth > this._recursionLimit)
    {
        throw new ArgumentException(AtlasWeb.JSON_DepthLimitExceeded);
    }
    JavaScriptConverter converter = null;
    if ((o != null) && this.ConverterExistsForType(o.GetType(), out converter))
    {
        IDictionary<string, object> dictionary = converter.Serialize(o, this);
        if (this.TypeResolver != null)
        {
            string str = this.TypeResolver.ResolveTypeId(o.GetType());
            if (str != null)
            {
                dictionary["__type"] = str;
            }
        }
        sb.Append(this.Serialize(dictionary));
    }
    else
    {
        this.SerializeValueInternal(o, sb, depth, objectsInUse);
    }
}

Если тип не может быть определен, сериализация все равно будет продолжена, но тип будет проигнорирован. Хорошей новостью является то, что поскольку анонимные типы наследуют getType() и возвращаемые имена динамически генерируются компилятором, TypeResolver возвращает null для ResolveTypeId и атрибут "__type" впоследствии игнорируется.

Я также воспользовался советом Джона Моррисона с внутренним конструктором на всякий случай, хотя, используя только этот метод, я все равно получал свойства __type в моем JSON-ответе.

//Given the following class
[XmlType("T")]
public class Foo
{
    internal Foo()
    {

    }

    [XmlAttribute("p")]
    public uint Bar
    {
        get;
        set;
    }
}

[WebService(Namespace = "http://me.com/10/8")]
[System.ComponentModel.ToolboxItem(false)]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class MyService : System.Web.Services.WebService
{

    //Return Anonymous Type to omit the __type property from JSON serialization
    [WebMethod(EnableSession = true)]
    [System.Web.Script.Services.ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json, XmlSerializeString = false)]
    public object GetFoo(int pageId)
    {
        //Kludge, returning an anonymois type using link, prevents returning the _type attribute.
        List<Foo> foos = new List<Foo>();
        rtnFoos.Add( new Foo(){
            Bar=99
        }};

        var rtn = from g in foos.AsEnumerable()
                   select g;

        return rtn;
    }
}

Примечание: Я использую унаследованный конвертер типов JSON, который считывает атрибуты XML Serialization из сериализованных типов для дальнейшего сжатия JSON. Благодаря CodeJournal. Работает как шарм.

0
ответ дан 24 November 2019 в 16:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: