C#JsonConverter JSONArray到字符串,带分隔符并返回



我想实现一个自定义的JsonConverter来使用,

[JsonConverter(typeof(ArrayString))]
public string ServiceCodes { get; set; }

目的是将JSON数组转换为具有分隔符的字符串。,["this", "is", "my", "json", "array"]应该变成"this;is;my;json;array"(或任何分隔符)。同样,反过来也是可能的。

我很难理解覆盖JsonConverterWriteJson方法。

为了提供一些上下文,IServiceCodes是实体上的一个属性(我使用的是EF6)。我认为,与其他一对多实现相比,实现我对案例的要求更容易。然而,我有一个问题,JsonConverter是什么时候调用的?

我只希望get在getter需要json时给出json,也就是说,当包含此属性的对象从我的API返回为json时。例如,我不希望在编写LINQ时调用此转换器。

任何帮助都将不胜感激,谢谢。

编辑-添加信息

这是类和一些moc数据。

[ComplexType]
public class TerminalDuties
{
public string TerminalCode { get; set; }
public string TransportationCode { get; set; }
[JsonConverter(typeof(ArrayString))]
public string ServiceCodes { get; set; }
}

"Origin": { "TerminalCode": "MIA", "TransportationCode": "GT", "ServiceCodes": ["WH", "HL"] }

我尝试了@felix-b的答案,但它不是映射。对象为null。我在ArrayString类中有断点,但没有命中。大概它没有尝试映射,因为属性是一个字符串。解决方法是什么?

以下是它在我的Web API控制器(继承自ApiController)中的公开方式

[HttpPost]
public void DoStuff([FromBody]Thing t)
{
someMngr.Add(t);
}
public class Thing : ParentClass
{
properties...
public TerminalDuties Origin { get; set; }
}

使用.NET Framework 4.6.1、ASP.NET Web API 2、Entity Framework 6.1.3、Newtonsoft.Json 10.0.3进行测试。

更新

我的回答最初要求指定[JsonConverter(typeof(ArrayString), ';')],而不是问题中的[JsonConverter(typeof(ArrayString))]

我为转换器类添加了默认构造函数,因此分隔符配置是可选的,如果没有指定,将使用分号。现在[JsonConverter(typeof(ArrayString))]也可以。

原始答案

转换器只会在通过JSON.NET对实体进行序列化和反序列化时调用。它不会影响从代码中获取或设置属性值,也不会影响LINQ查询和DB操作。

以下是转换器实现:

public class ArrayString : JsonConverter
{
private readonly char _delimiter;
// UPDATE -- added default constructor, so that 
// JsonConverter attribute can be specified without the 
// delimiter parameter, in which case semicolon will be used
public ArrayString() : this(';')
{
}
public ArrayString(char delimiter)
{
_delimiter = delimiter;
}
public override bool CanRead => true;
public override bool CanWrite => true;
public override bool CanConvert(Type objectType)
{
return true; 
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType != JsonToken.StartArray)
{
return null;
}
var stringValue = new StringBuilder();
while (reader.Read() && reader.TokenType == JsonToken.String)
{
if (stringValue.Length > 0)
{
stringValue.Append(_delimiter);
}
stringValue.Append((string)reader.Value);
}
return stringValue.ToString();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var stringValue = value?.ToString();
if (stringValue == null)
{
writer.WriteNull();
return;
}
var arrayValue = stringValue.Split(_delimiter);
writer.WriteStartArray();
foreach (var item in arrayValue)
{
writer.WriteValue(item);
}
writer.WriteEndArray();
}
}

以下是如何指定分隔符(本例中为分号):

[JsonConverter(typeof(ArrayString), ';')]
public string ServiceCodes { get; set; }

相关内容

  • 没有找到相关文章

最新更新