无法将c#序列化为json

时间:2016-02-09 21:40:08

标签: 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 { 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输出?

2 个答案:

答案 0 :(得分:3)

如果您要序列化Data类的实例,那么您将从示例中获取json。

vDate = Format(vDate, "M/D/YYYY H:MM:SS AM/PM")
xDate = IsDate(vDate)

答案 1 :(得分:0)

我之前遇到过类似的问题。

因此,使用答案hereJSON.NET序列化程序

这可以通过定义自定义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);
        }

我希望这会有所帮助。 :)