gpt4 book ai didi

c# - 为数组的数组命名

转载 作者:行者123 更新时间:2023-11-30 23:02:27 24 4
gpt4 key购买 nike

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

希望下面的代码可以证明这一点。

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

用法:

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

var myObj = JsonConvert.DeserializeObject<TheData>(json);

这工作正常,但是,我想将 dataItems 的类型从 List 更改为 List,如下所示:

    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; }
}

但是,这会导致异常:

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.

错误消息表明我想要的结果可能无法实现,但有人可以建议如何纠正这个问题吗?我无法控制 JSON 格式(除非我在检索到字符串后对其进行操作)。如果有任何不同,我正在使用 .Net 4.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;
}
}

然后通过装饰你的类型来指定这个转换后的对象:

[JsonConverter(typeof(DataItemConverter))]
public class DataItem {
public string deldate { get; set; }
public int value { get; set; }
}

然后它应该会如您所愿地工作。

如果通用JsonConverter<>在您的 Json.NET 版本中不可用 - 使用非通用版本:

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);
}
}

关于c# - 为数组的数组命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50465412/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com