2013-07-18 3 views
0

У меня есть класс:десериализации JSON с различными типами для сериализации/десериализации

[DataContract] 
public class A 
{ 
    [DataMember] 
    public B ArbitraryProperty { get; set;} 
} 

При сериализации «ArbitraryProperty» должна быть в виде класса «B»:

[DataContract] 
public class B 
{ 
    [DataMember] 
    public string ValueA { get; set; } 
    [DataMember] 
    public string ValueB { get; set; } 
} 

Вот выход JSON:

{ 
    "ArbitraryProperty": { "ValueA": "I'm a value.", "ValueB": "I'm a value too!" } 
} 

Когда я получаю тот же объект обратно с сервера, хотя свойство возвращается в виде sim PLE строка, как это:

{ 
    "ArbitraryProperty": "I'm not a B, muahahaha!!!" 
} 

Там должен быть уловкой, чтобы позволить DataContractJsonSerializer знать, что он должен десериализацию значения в строку вместо «B».

Есть ли специальный способ настройки класса «А»? :/

Любые предложения?

+0

Звучит так, как будто у вас есть два класса, у которых есть свойство «B», и свойство «string». Ваш результат и то, что вы говорите, возвращаются, это две абсолютно несвязанные структуры данных. –

+0

@JoeEnos Следовательно проблема: Я действительно не хочу, чтобы создавать разные классы для моих запросов и типов ответов ... – Tim

ответ

0

Я не думаю, что это правильный путь - я считаю, что правильный ответ для удобочитаемости и удобства использования - это правильно ввести запрос и класс ответа. Но ... Единственное, о чем я могу думать, это сделать свойство object, а не сильно набирать его. Вам просто нужно убедиться, что при назначении ему значения вы назначаете правильный тип.

public class A 
{ 
    public object ArbitraryProperty { get; set; } 
} 

Это еще сериализации правильно:

var a = new A { ArbitraryProperty = new B { ValueA = "a", ValueB = "b" } }; 
var json = JsonConvert.SerializeObject(a); 
Console.WriteLine(json); 

Когда объект возвращается, десериализация поместит эту строку в собственность.

json = "{'ArbitraryProperty':'This is some string'}"; 
a = JsonConvert.DeserializeObject<A>(json); 

Этот код работает с простой сериализации/десериализации из Json.NET, но я не знаю, если WebAPI или любой другой технологии вы используете понравится.

+0

Я решил, что это будет выглядеть примерно так. Я думаю, что я буду принимать ваши советы, поступаю правильно и просто создавать разные типы. Благодаря! – Tim