C# 给数组的数组命名

C# 给数组的数组命名,c#,arrays,json,json.net,C#,Arrays,Json,Json.net,我正在使用Newtonsoft将一些JSon解析为.Net类型。json包含一个名为“data”的数组。我想让数据数组中的每个数组都是自己的类型,但我不确定如何做到这一点 希望下面的代码能够演示这一点 public class TheData { [JsonProperty(PropertyName = "data")] public List<object> dataItems { get; set; } } 公共类数据 {

我正在使用Newtonsoft将一些JSon解析为.Net类型。json包含一个名为“data”的数组。我想让数据数组中的每个数组都是自己的类型,但我不确定如何做到这一点

希望下面的代码能够演示这一点

    public class TheData
    {
        [JsonProperty(PropertyName = "data")]
        public List<object> dataItems { get; set; }
    }
公共类数据
{
[JsonProperty(PropertyName=“data”)]
公共列表数据项{get;set;}
}
用法:

        string json =
            "{\"data\":[[\"20180511\",1094391],[\"20180504\",1097315],[\"20180427\",1100221],[\"20180420\",1094455],[\"20180413\",1093023]]}";

        var myObj = JsonConvert.DeserializeObject<TheData>(json);
stringjson=
“{”数据\“:[[“20180511\”,1094391],“20180504\”,1097315],“20180427\”,1100221],“20180420\”,1094455],“20180413\”,1093023];
var myObj=JsonConvert.DeserializeObject(json);
这可以正常工作,但是,我想将数据项的类型从一个列表更改为另一个列表,如下所示:

    public class TheData
    {
        [JsonProperty(PropertyName = "data")]
        public List<DataItem> dataItems { get; set; }
    }

public class DataItem
{
    public string deldate { get; set; }
    public int value { get; set; }
}
公共类数据
{
[JsonProperty(PropertyName=“data”)]
公共列表数据项{get;set;}
}
公共类数据项
{
公共字符串deldate{get;set;}
公共int值{get;set;}
}
但是,这会导致一个例外情况:

Newtonsoft.Json.JsonSerializationException occurred
  HResult=-2146233088
  Message=Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'CE.FOTools.Feeds2.EIA.DataItem' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.
To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.
Path 'data[0]', line 1, position 10.
Newtonsoft.Json.JsonSerializationException发生异常
HResult=-2146233088
Message=无法将当前JSON数组(例如[1,2,3])反序列化为类型“CE.FOTools.Feeds2.EIA.DataItem”,因为该类型需要一个JSON对象(例如{“name”:“value”})才能正确反序列化。
要修复此错误,请将JSON更改为JSON对象(例如{“name”:“value”}),或将反序列化类型更改为数组或实现可从JSON数组反序列化的集合接口(例如ICollection、IList)类似列表的类型。还可以将JsonArrayAttribute添加到类型中,以强制它从JSON数组反序列化。
路径“数据[0]”,第1行,位置10。

错误信息表明我所期望的结果可能不可能实现,但有人能建议如何更正此错误吗?我无法控制JSON格式(除非在检索字符串后对其进行操作)。如果有什么不同的话,我使用的是.NET4.5。

我认为最不显眼的方法是使用自定义转换器。例如:

class DataItemConverter : JsonConverter<DataItem> {
    public override void WriteJson(JsonWriter writer, DataItem value, JsonSerializer serializer) {
        // if item can be null - handle that
        writer.WriteStartArray();
        writer.WriteValue(value.deldate);
        writer.WriteValue(value.value);
        writer.WriteEndArray();
    }

    public override DataItem ReadJson(JsonReader reader, Type objectType, DataItem existingValue, bool hasExistingValue, JsonSerializer serializer) {
        var ar = serializer.Deserialize<List<object>>(reader);
        // perform some checks for length and data types, omitted here
        var result = new DataItem();
        result.deldate = (string) ar[0];
        result.value = Convert.ToInt32(ar[1]);
        return result;
    }
}
在那之后,它应该像你期望的那样工作

如果您的Json.NET版本中没有通用
JsonConverter
,请使用非通用版本:

class DataItemConverter : JsonConverter {
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
        var item = (DataItem) value;
        // if null is possible - handle that
        writer.WriteStartArray();
        if (item != null) {
            writer.WriteValue(item.deldate);
            writer.WriteValue(item.value);
        }

        writer.WriteEndArray();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
        var ar = serializer.Deserialize<List<object>>(reader);
        // perform some checks for length and data types, omitted here
        var result = new DataItem();
        result.deldate = (string) ar[0];
        result.value = Convert.ToInt32(ar[1]);
        return result;
    }

    public override bool CanConvert(Type objectType) {
        return objectType == typeof(DataItem);
    }
}
类DataItemConverter:JsonConverter{
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器){
变量项=(数据项)值;
//如果可能为空,请处理该问题
writer.writestarray();
如果(项!=null){
writer.WriteValue(item.deldate);
writer.WriteValue(item.value);
}
writer.WriteEndArray();
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序){
var ar=序列化程序。反序列化(读取器);
//对长度和数据类型执行一些检查,此处省略
var result=新数据项();
result.deldate=(字符串)ar[0];
result.value=Convert.ToInt32(ar[1]);
返回结果;
}
公共覆盖布尔CanConvert(类型objectType){
return objectType==typeof(数据项);
}
}

非常感谢您的回答。我想我可能使用的是旧版本的Newtonsoft,因为它无法编译。我会花一点时间升级并报告。@GinjaNinja我已经用旧版本更新了答案。
class DataItemConverter : JsonConverter {
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
        var item = (DataItem) value;
        // if null is possible - handle that
        writer.WriteStartArray();
        if (item != null) {
            writer.WriteValue(item.deldate);
            writer.WriteValue(item.value);
        }

        writer.WriteEndArray();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
        var ar = serializer.Deserialize<List<object>>(reader);
        // perform some checks for length and data types, omitted here
        var result = new DataItem();
        result.deldate = (string) ar[0];
        result.value = Convert.ToInt32(ar[1]);
        return result;
    }

    public override bool CanConvert(Type objectType) {
        return objectType == typeof(DataItem);
    }
}