我正在尝试将c#对象序列化为json以发布到外部rest api。
对象中on属性的描述是“LineItems是LineItem的列表”
基于此,在C#中,我只是这样做:
public List<LineItem> lineItems { get; set; }
public class LineItem
{
public string dealerProductCode { get; set; }
public string description { get; set; }
public string quantity { get; set; }
public string amount { get; set; }
}
将序列化为json,如下所示:
{
//other properties etc
"lineItems":[
{
"dealerProductCode":"asdf",
"description":"asdf",
"quantity":"1",
"amount":"100"
}
]
}
然而,他们给出了两个例子,一个用xml,一个用json。
JSON:
{
//other properties etc
"lineItems":{
"lineItem":[
{
"dealerProductCode":"asdf",
"description":"asdf",
"quantity":"1",
"amount":"100"
}
]
}
}
对我来说,这看起来像...... - 一个名为lineItems的对象 - 包含一个名为lineItem的数组 - 该数组中的第一项是lineItem对象
在xml示例中,似乎更有意义:
<lineItems>
<!--1 or more repetitions:-->
<lineItem>
<dealerProductCode>asdf</dealerProductCode>
<description>asdf</description>
<quantity>1</quantity>
<amount>1</amount>
</lineItem>
</lineItems>
如何制作我的C#以生成他们在示例中的json输出?
答案 0 :(得分:3)
如果您要序列化Data类的实例,那么您将从示例中获取json。
vDate = Format(vDate, "M/D/YYYY H:MM:SS AM/PM")
xDate = IsDate(vDate)
答案 1 :(得分:0)
我之前遇到过类似的问题。
这可以通过定义自定义JsonConverter并覆盖名称来实现。
它适用于所有IEnumerable对象。
首先使用以下注释装饰IEnumerable对象:
[JsonConverter(typeof(JSONSettings.AssociativeArraysConverter<LineItemFieldNameResolver>))]
public List<LineItem> lineItems { get; set; }
这是自定义实现,
public class LineItemFieldNameResolver : IAssociateFieldNameResolver
{
public string ResolveFieldName(object i_Object)
{
var item = (i_Object as LineItem);
return "lineitem";
}
}
public class AssociativeArraysConverter<T> : JsonConverter
where T : IAssociateFieldNameResolver, new()
{
private readonly T _mFieldNameResolver;
public AssociativeArraysConverter()
{
_mFieldNameResolver = new T();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
JsonSerializer serializer)
{
throw new NotImplementedException(
"Unnecessary because CanRead is false. The type will skip the converter.");
}
public override bool CanRead
{
get { return false; }
}
public override bool CanConvert(Type objectType)
{
return typeof(IEnumerable).IsAssignableFrom(objectType) &&
!typeof(string).IsAssignableFrom(objectType);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var collectionObj = value as IEnumerable;
writer.WriteStartObject();
foreach (var currObj in collectionObj)
{
writer.WritePropertyName(_mFieldNameResolver.ResolveFieldName(currObj));
serializer.Serialize(writer, currObj);
}
writer.WriteEndObject();
}
}
public interface IAssociateFieldNameResolver
{
string ResolveFieldName(object i_Object);
}
我希望这会有所帮助。 :)