Сериализация неизвестного типа в JSON
От: KARALIUS Россия http://ci-school.org
Дата: 21.05.19 14:44
Оценка:
Есть структуры и метод
[DataContract]
public struct DocumentData
{
    [DataMember]
    public string key; // Field id
    [DataMember]
    public object value; // Value for the Field
};

[DataContract]
public struct DocumentDataInt
{
    [DataMember(EmitDefaultValue=false)]
    public DocumentData[] document_data;
    
    [DataMember(EmitDefaultValue=false)]
    public string error_message;
}

[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json)]
public DocumentData GetDocumentData(Guid document_id)

и всё хорошо работает пока value в DocumentData — простые типы — строка или число.

Но если я хочу поместить в value что-то вроде массива других структур
[DataContract]
public struct SingleDamage
{
    [DataMember(Name = "TYPE")]
    public string Type;
    
    [DataMember(Name = "PART")]
    public string Part;
}
...
x.value = new SingleDamage[10];
...

то веб-сервис падает с непонятной ошибкой.
Есть способ вернуть такой массив, не нарушая обшего подхода?
----
При промывке мозгов извилины стираются.
json
Re: Сериализация неизвестного типа в JSON
От: Sinclair Россия https://github.com/evilguest/
Дата: 22.05.19 04:20
Оценка:
Здравствуйте, KARALIUS, Вы писали:
KAR>Есть способ вернуть такой массив, не нарушая обшего подхода?
Надо поиграть с knowntype.
[DataContract]
[KnownType(typeof(SingleDamage[]))]
public struct DocumentData
{
    [DataMember]
    public string key; // Field id
    [DataMember]
    public object value; // Value for the Field
};

Возможно, потребуется перейти от SingleDamage[] к List<SingleDamage>.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Сериализация неизвестного типа в JSON
От: varenikAA  
Дата: 22.05.19 04:37
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, KARALIUS, Вы писали:

KAR>>Есть способ вернуть такой массив, не нарушая обшего подхода?
S>Надо поиграть с knowntype.
Согласен, был затык с наследниками. Этот аттрибут спас.
Но, object, тогда бы уж лучше string тоже в формате json, все равно кастить.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Сериализация неизвестного типа в JSON
От: Mihas  
Дата: 22.05.19 06:25
Оценка:
Здравствуйте, KARALIUS, Вы писали:

KAR>Есть способ вернуть такой массив, не нарушая обшего подхода?

Другой сериализатор нарушит общий подход?
https://www.newtonsoft.com/json , например.
Re[2]: Сериализация неизвестного типа в JSON
От: KARALIUS Россия http://ci-school.org
Дата: 22.05.19 07:09
Оценка:
А как мне его в OperationContract засунуть?
----
При промывке мозгов извилины стираются.
Re[3]: Сериализация неизвестного типа в JSON
От: Ночной Смотрящий Россия  
Дата: 22.05.19 07:16
Оценка:
Здравствуйте, KARALIUS, Вы писали:

KAR>А как мне его в OperationContract засунуть?


        var serializerSettings = new JsonSerializerSettings();

        serializerSettings.Converters.Add(new IsoDateTimeConverter());
        serializerSettings.Converters.Add(new BinaryConverter());
        serializerSettings.Converters.Add(new JavaScriptDateTimeConverter());
        serializerSettings.Converters.Add(new BinaryConverter());
        serializerSettings.Converters.Add(new StringEnumConverter());

        var config = HttpHostConfiguration.Create().Configuration;

        Microsoft.ApplicationServer.Http.JsonMediaTypeFormatter jsonFormatter = config.OperationHandlerFactory.Formatters.JsonFormatter;

        config.OperationHandlerFactory.Formatters.Remove(jsonFormatter);

        config.OperationHandlerFactory.Formatters.Insert(0, new JsonNetMediaTypeFormatter(serializerSettings));

        var httpServiceFactory = new HttpServiceHostFactory
        {
            OperationHandlerFactory = config.OperationHandlerFactory,
            MessageHandlerFactory = config.MessageHandlerFactory
        };
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[2]: Сериализация неизвестного типа в JSON
От: KARALIUS Россия http://ci-school.org
Дата: 22.05.19 07:49
Оценка:
Спасибо, помогло!

Маленький вопрос остался. Он мне возвращает
{
    "__type": "SingleDamage:#ххх.yyy",
    "PART": "Переднее правое крыло",
    "TYPE": "Сколы"
}

__type — это не моё, можно ли от него избавиться?
----
При промывке мозгов извилины стираются.
Отредактировано 22.05.2019 7:50 KARALIUS . Предыдущая версия .
Re[3]: Сериализация неизвестного типа в JSON
От: Sinclair Россия https://github.com/evilguest/
Дата: 22.05.19 08:32
Оценка:
Здравствуйте, KARALIUS, Вы писали:

KAR>Спасибо, помогло!


KAR>Маленький вопрос остался. Он мне возвращает

KAR>
KAR>{
KAR>    "__type": "SingleDamage:#ххх.yyy",
KAR>    "PART": "Переднее правое крыло",
KAR>    "TYPE": "Сколы"
KAR>}
KAR>

KAR>__type — это не моё, можно ли от него избавиться?
1. А как вы планируете определять тип при парсинге?
2. Попробуйте BodyStyle = WebMessageBodyStyle.Bare:
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
public DocumentData GetDocumentData(Guid document_id)
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.