Ўсталяваць JSON корань аб'екта з дапамогай DataContractJsonSerializer

Пры серыялізацыі аб'екта з дапамогай System.Runtime.Serialization.Json.DataContractJsonSerializer , ёсць спосаб ўсталяваць «корань» або клавішу верхняга ўзроўню ў радку JSON?

Напрыклад, вось клас:

[DataContract]
public class Person
{
    public Person() { }
    public Person(string firstname, string lastname)
    {
        this.FirstName = firstname;
        this.LastName = lastname;
    }

    [DataMember]
    public string FirstName { get; set; }

    [DataMember]
    public string LastName { get; set; }
}

Калі серыялізацыя з дапамогай ...

public static string Serialize(T obj)
{
    Json.DataContractJsonSerializer serializer = 
        new DataContractJsonSerializer(obj.GetType());
    MemoryStream ms = new MemoryStream();
    serializer.WriteObject(ms, obj);
    string retVal = Encoding.Default.GetString(ms.ToArray());
    ms.Dispose();
    return retVal;
}

Атрыманая радок JSON выглядае наступным чынам:

{"FirstName":"Jane","LastName":"McDoe"}

Ці ёсць спосаб, каб мець сериалайзер суаднесці некаторыя значэння?

Напрыклад:

{Person: {"FirstName":"Jane","LastName":"McDoe"}}

Вядома, я мог бы проста змяніць Serialize спосаб абгарнуць вернуты JSON радок, напрыклад.:

string retVal = "{Person:" + Encoding.Default.GetString(ms.ToArray()) + "}";

Але мне было цікава, ці ёсць нейкі спосаб сказаць сериалайзер, каб дадаць яго? <Код> Прастора імёнаў ўласцівасць на DataContract атрыбут, здаецца, не дапаможа.

4
На самай справе я працую на кліенце CouchDB .. пры даданні аб'екта (JSON) з дапамогай API CouchDB ён хоча аб'ект мець пазнаку. Я праверу Json.NET таксама. Дзякуй
дададзена аўтар ZimSystem, крыніца
Я таксама заўважыў, што адзін з сігнатур метаду серыялізацыі запытвае параметр «XmlDictionaryString rootName», але гэта не падобна на працу .. добра на Json.NET прама цяпер
дададзена аўтар ZimSystem, крыніца
Выкарыстоўвайце JSON.NET , ён будзе сур'ёзна зрабіць вашу жыццё <я> шмат прасцей пры працы з JSON; Я знаходжу .NET прапановы з уласных каробак, каб быць вельмі, вельмі не хапаю.
дададзена аўтар casperOne, крыніца
Чаму вы хочаце, каб абгарнуць яго ў тып? Тое, што вы прапануеце не падаецца добрай JSON для мяне. Я б проста пайсці на адзін крок далей і проста зрабіць масіў. {Персаналіі: [Асоба]}
дададзена аўтар Jamie, крыніца

1 адказы

Вы можаце зрабіць гэта, але гэта не тое, што занадта добра - вы павінны ведаць некаторыя JSON для адлюстравання xml правілаў якіх DataContractJsonSerializer выкарыстоўвае. Для простага выпадкі, калі вы проста хочаце, каб абгарнуць аб'ект у імя тыпу, гэта даволі проста - ніжэй код робіць гэта. Вам трэба стварыць сериализатор з імем «корань» вы хочаце (у дадзеным выпадку я выкарыстаў імя тыпу), і перадаць ёй XmlDictionaryWriter асобнік якога атрыманы каранёвай элемент.

public class StackOverflow_7930629
{
    [DataContract]
    public class Person
    {
        public Person() { }
        public Person(string firstname, string lastname)
        {
            this.FirstName = firstname;
            this.LastName = lastname;
        }

        [DataMember]
        public string FirstName { get; set; }

        [DataMember]
        public string LastName { get; set; }
    }

    public static string Serialize(T obj)
    {
        DataContractJsonSerializer serializer =
            new DataContractJsonSerializer(typeof(T), typeof(T).Name);
        MemoryStream ms = new MemoryStream();
        XmlDictionaryWriter w = JsonReaderWriterFactory.CreateJsonWriter(ms);
        w.WriteStartElement("root");
        w.WriteAttributeString("type", "object");
        serializer.WriteObject(w, obj);
        w.WriteEndElement();
        w.Flush();
        string retVal = Encoding.Default.GetString(ms.ToArray());
        ms.Dispose();
        return retVal;
    }
    public static void Test()
    {
        Console.WriteLine(Serialize(new Person("Jane", "McDoe")));
    }
}

Як ужо было сказана ў адным з каментароў, працы з JSON і DataContractJsonSerializer гэта не тое, што занадта прыязна. Некаторыя JSON-спецыфічныя бібліятэкі, такія як Json.NET або тыпаў JsonValue (NuGet пакет JsonValue) можа зрабіць вашу жыццё нашмат прасцей.

1
дададзена