C# 给数组的数组命名
我正在使用Newtonsoft将一些JSon解析为.Net类型。json包含一个名为“data”的数组。我想让数据数组中的每个数组都是自己的类型,但我不确定如何做到这一点 希望下面的代码能够演示这一点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; } } 公共类数据 {
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);
}
}