Вопрос

Я использовал json.net для сериализации словарей типа словаря, и когда я добавил целые числа или логические в словаре, когда десериализация я вернул целые числа и логические. Теперь я пытался изменить свой код, чтобы использовать ServiceStack.text вместо этого из -за проблемы в другой части кода с сериализацией дат, но теперь я получаю логические целые числа как строки после десериализации. Есть ли способ иметь такое же поведение, что и json.net?

Вот код, чтобы воспроизвести его: https://gist.github.com/1608951Test_jsonnet проходит, но оба test_servicestack_text_typeserializer и test_servicestack_text_jsonserializer

Это было полезно?

Решение

Это целенаправленное решение о проектировании, что информация о типе не излучается для примитивных типов значений, поэтому значения остаются в виде строк.

Вы должны либо опустошить в сильном типированном Poco, который содержит информацию о типе:

public class MixType
{
    public string a { get; set; }
    public int b { get; set; }
    public bool c{ get; set; }
}

var mixedMap = new Dictionary<string, object> {
    { "a", "text" },
    { "b", 32 },
    { "c", false },
};

var json = JsonSerializer.SerializeToString(mixedMap);
Console.WriteLine("JSON:\n" + json);

var mixedType = json.FromJson<MixType>();
Assert.AreEqual("text", mixedType.a);
Assert.AreEqual(32, mixedType.b);
Assert.AreEqual(false, mixedType.c);

Или десериализовать в Dictionary<string,string> и разрабатывать в конкретные типы самостоятельно.

Или десериализуйте с использованием динамического API ServiceStack. Видеть Динамическая тестовая папка JSON в ServiceStack Для примеров, как это сделать.

Другие советы

Теперь вы можете сделать это:

JsConfig.TryToParsePrimitiveTypeValues = true;

Что заставит JSON Deserializer попытаться определить, какими должны быть типы, и вы вернете своих целых чисел в качестве целых чисел, логии обратно в качестве логических и т. Д.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top