Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将c#序列化为json时遇到问题_C#_Json_Serialization - Fatal编程技术网

将c#序列化为json时遇到问题

将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

我正在尝试将一个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; }
}
然而,他们给出了两个例子,一个是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)