将c#序列化为json时遇到问题
我正在尝试将一个c#对象序列化为json,以发布到外部rest api “我的对象”中的on属性的说明是“LineItems是LineItem的列表” 基于此,在C#中,我只需这样做:将c#序列化为json时遇到问题,c#,json,serialization,C#,Json,Serialization,我正在尝试将一个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
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; }
}
然而,他们给出了两个例子,一个是xml,一个是json
json:
对我来说,这看起来像。。。
-一个名为lineItems的对象
-包含名为lineItem的数组的
-该数组中的第一项是lineItem对象
在xml示例中,它似乎更有意义:
<lineItems>
<!--1 or more repetitions:-->
<lineItem>
<dealerProductCode>asdf</dealerProductCode>
<description>asdf</description>
<quantity>1</quantity>
<amount>1</amount>
</lineItem>
</lineItems>
asdf
asdf
1.
1.
我如何制作我的C#来生成他们在示例中的json输出?如果您要序列化数据类的实例,您将从示例中获得json
public class LineItem
{
public string dealerProductCode { get; set; }
public string description { get; set; }
public string quantity { get; set; }
public string amount { get; set; }
}
public class LineItemContainer
{
public List<LineItem> lineItem{get;set;}
}
public class Data
{
public LineItemContainer lineItems {get;set;}
}
公共类行项目
{
公共字符串DealProductCode{get;set;}
公共字符串说明{get;set;}
公共字符串数量{get;set;}
公共字符串金额{get;set;}
}
公共类LineItemContainer
{
公共列表行项目{get;set;}
}
公共类数据
{
公共LineItemContainer lineItems{get;set;}
}
如果要序列化数据类的实例,将从示例中获取json
public class LineItem
{
public string dealerProductCode { get; set; }
public string description { get; set; }
public string quantity { get; set; }
public string amount { get; set; }
}
public class LineItemContainer
{
public List<LineItem> lineItem{get;set;}
}
public class Data
{
public LineItemContainer lineItems {get;set;}
}
公共类行项目
{
公共字符串DealProductCode{get;set;}
公共字符串说明{get;set;}
公共字符串数量{get;set;}
公共字符串金额{get;set;}
}
公共类LineItemContainer
{
公共列表行项目{get;set;}
}
公共类数据
{
公共LineItemContainer lineItems{get;set;}
}
我以前也遇到过类似的问题
所以,使用答案和序列化程序
这可以通过定义自定义JsonConverter并重写名称来实现
它将适用于所有IEnumerable对象
首先用以下注释装饰IEnumerable对象:
[JsonConverter(typeof(JSONSettings.AssociativeArraysConverter<LineItemFieldNameResolver>))]
public List<LineItem> lineItems { get; set; }
[JsonConverter(typeof(JSONSettings.associateArraySconverter))]
公共列表行项目{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);
}
公共类LineItemFieldNameResolver:IASociatedFieldNameResolver
{
公共字符串ResolveFieldName(对象i\u对象)
{
变量项=(i_对象作为行项);
返回“行项目”;
}
}
公共类AssociateArraySConverter:JsonConverter
其中T:iaSociateFieldNameResolver,new()
{
专用只读T_mFieldNameResolver;
公共关联ArraySConverter()
{
_mFieldNameResolver=新的T();
}
public override object ReadJson(JsonReader reader,Type objectType,object existingValue,
JsonSerializer(序列化程序)
{
抛出新的NotImplementedException(
“不必要,因为CanRead为false。该类型将跳过转换器。”);
}
公共覆盖布尔可读取
{
获取{return false;}
}
公共覆盖布尔CanConvert(类型objectType)
{
返回类型(IEnumerable).IsAssignableFrom(objectType)&&
!typeof(string).IsAssignableFrom(objectType);
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
var collectionObj=作为IEnumerable的值;
writer.WriteStartObject();
foreach(collectionObj中的var currObj)
{
writer.WritePropertyName(mFieldNameResolver.ResolveFieldName(currObj));
serializer.Serialize(writer,currObj);
}
writer.WriteEndObject();
}
}
公共接口IASociateFieldNameResolver
{
字符串ResolveFieldName(对象i_对象);
}
我希望这有帮助。:) 我以前也遇到过类似的问题 所以,使用答案和序列化程序 这可以通过定义自定义JsonConverter并重写名称来实现 它将适用于所有IEnumerable对象 首先用以下注释装饰IEnumerable对象:
[JsonConverter(typeof(JSONSettings.AssociativeArraysConverter<LineItemFieldNameResolver>))]
public List<LineItem> lineItems { get; set; }
[JsonConverter(typeof(JSONSettings.associateArraySconverter))]
公共列表行项目{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);
}
公共类LineItemFieldNameResolver:IASociatedFieldNameResolver
{
公共字符串ResolveFieldName(对象i\u对象)
{
变量项=(i_对象作为行项);
返回“行项目”;
}
}
公共类AssociateArraySConverter:JsonConverter
其中T:iaSociateFieldNameResolver,new()
{
专用只读T_mFieldNameResolver;
公共关联ArraySConverter()
{
_mFieldNameResolver=新的T();
}
public override object ReadJson(JsonReader reader,Type objectType,object existingValue,
JsonSerializer(序列化程序)
{
抛出新的NotImplementedException(
“不必要,因为CanRead为false。该类型将跳过转换器。”);
}
公共覆盖布尔可读取
{
获取{return false;}
}
公共覆盖布尔CanConvert(类型objectType)
{
返回类型(IEnumerable).IsAssignableFrom(objectType)&&
!typeof(string).IsAssignableFrom(objectType);
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
var collectionObj=作为IEnumerable的值;
writer.WriteStartObject();
foreach(collectionObj中的var currObj)