Как преобразовать длинный тип в строковый тип, когда объект Serialize To JSON [duplicate]

Спецификация [0] текстового модуля CSS определяет свойство text-space-collapse , позволяющее управлять тем, как белое пространство внутри и вокруг элемента обрабатывается.

Итак, в отношении ваш пример, вам просто нужно написать это:

p {
  text-space-collapse: discard;
}

К сожалению, ни один браузер не реализует это свойство еще (по состоянию на сентябрь 2016 года), как упоминалось в комментариях к ответу HBP .

12
задан Bruno 28 June 2013 в 17:19
поделиться

5 ответов

Возможно, вы можете создать пользовательский JsonConverter и применить его к свойству.

Ниже приведен пример (ПРИМЕЧАНИЕ. Я не использовал этот api раньше, поэтому его, вероятно, можно было бы улучшить больше, но Следующее должно дать вам приблизительную идею):

public class Person
{
    [JsonConverter(typeof(IdToStringConverter))]
    public long ID { get; set; }

    public string Name { get; set; }
}

public class IdToStringConverter : JsonConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JToken jt = JValue.ReadFrom(reader);

        return jt.Value<long>();
    }

    public override bool CanConvert(Type objectType)
    {
        return typeof(System.Int64).Equals(objectType);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value.ToString());
    }
}

Действие веб-API:

public Person Post([FromBody]Person person)
{
    return person;
}

Запрос:

POST http://asdfasdf/api/values HTTP/1.1  
Host: servername:9095  
Connection: Keep-Alive  
Content-Type: application/json  
Content-Length: 42  

{"ID":"1306270928525862400","Name":"Mike"}

Ответ:

HTTP/1.1 200 OK  
Content-Length: 42  
Content-Type: application/json; charset=utf-8  
Server: Microsoft-HTTPAPI/2.0  
Date: Fri, 28 Jun 2013 17:02:18 GMT  

{"ID":"1306270928525862400","Name":"Mike"}

EDIT: если вы не хотите украшать свойство атрибутом, вы можете добавить его в коллекцию Converters. Пример:

config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new IdToStringConverter());
16
ответ дан Kiran Challa 27 August 2018 в 11:49
поделиться

Я бы, вероятно, просто создал анонимный тип, когда я вызываю сериализатор json, например:

 JsonConvert.SerializeObject(new { instance.Name, instance.ID.ToString() } );

В том случае, если ваш класс имеет 20 или что-то другое, и это становится очень уродливым решением, я бы добавил строка в класс с именем ID, измените длину до lID или что-то еще и используйте настройки сериализатора, чтобы игнорировать длинные при сериализации, поэтому в результате json будет иметь только строчную версию.

несколько различных атрибутов, которые будут выполнены, например:

 public class CustomerEntity
 {
      [ScriptIgnore]
      public long _ID { get; set; }
      public string ID { get; set; }
      public string Name { get; set; }
 }

Не будет сериализоваться _ID

2
ответ дан evanmcdonnal 27 August 2018 в 11:49
поделиться

В зависимости от вашего случая вы могли бы использовать геттеры и сеттеры для маскировки свойства как строки во время сериализации JSON.

public class Money
{
    [JsonIgnore]
    public decimal Money { get; set; }

    [JsonProperty("money")]
    public string MoneyAsString
    {
        get { return Money.ToString("0.00"); }
        set { Money = decimal.Parse(value); }
    }
}
0
ответ дан jocull 27 August 2018 в 11:49
поделиться

Как насчет view model, который имеет только свойства string, например:

public class CustomerEntityViewModel
{
    public string ID { get; set; }
    public string Name { get; set; }
}

Теперь вы имеете дело только с проблемами [сериализации string и JSON].

2
ответ дан Karl Anderson 27 August 2018 в 11:49
поделиться

Возможно, жизнеспособным решением будет использование другого типа для ID? Например, вы можете использовать GUID. С GUID вы никогда не закончите границы, и, по-моему, это будет сериализоваться как строка.

0
ответ дан mario 27 August 2018 в 11:49
поделиться
Другие вопросы по тегам:

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