gpt4 book ai didi

c# - JSON 到数据表忽略数组

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

我正在尝试编写一个通用方法,它将采用 JSON 字符串并将其转换为 DataTable(尽其所能)。

它工作正常,直到它遇到一个以数组作为属性之一的 JSON 对象。

我想做的是忽略数组属性并尽可能地进行转换。

我有一个 fiddle 示例来解释我正在尝试做的事情: https://dotnetfiddle.net/cgkNov

public static void Main()
{
const string JsonObject = @"[{Id:""672af604-495b-4dc0-933e-6c55f56bef82"",""Name"":""1"",""MyArray"":[]}]";
const string EndResultJsonObject = @"[{Id:""672af604-495b-4dc0-933e-6c55f56bef82"",""Name"":""1""}]";
var settings = new JsonSerializerSettings
{
Error = (obj, args) =>
{
var context = args.ErrorContext;

context.Handled = true;
}
};
var a = JsonConvert.DeserializeObject<DataTable>(JsonObject, settings);

Console.WriteLine(JsonConvert.SerializeObject(a));

a = JsonConvert.DeserializeObject<DataTable>(EndResultJsonObject, settings);

Console.WriteLine(JsonConvert.SerializeObject(a));
}

谢谢,亚历克斯

最佳答案

如果你想跳过数组,你可以使用这样的东西。这只是一个示例,您可能应该改进它。添加自定义转换器:

public class SkipArrayConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return !objectType.IsArray;
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JArray array = JArray.Load(reader);
DataTable dataTable = new DataTable();
int i = 0;
foreach (JToken token in array.Children())
{
var dataRow = dataTable.NewRow();
if (token.Type != JTokenType.Object) continue;

if (i == 0)
{
SetColumns(dataTable, token);
dataRow = dataTable.NewRow();
i++;
}

foreach (JToken jToken in token)
{
if (((JProperty)jToken).Value.Type != JTokenType.Array)
{
string name = ((JProperty)jToken).Name;
object value = ((JValue)((JProperty)jToken).Value).Value;
dataRow[name] = value;
}
}

dataTable.Rows.Add(dataRow);
}
return dataTable;
}

private void SetColumns(DataTable dt, JToken token)
{
foreach (JToken jToken in token)
{
if (((JProperty)jToken).Value.Type != JTokenType.Array)
{
string name = ((JProperty)jToken).Name;
object value = ((JValue)((JProperty)jToken).Value).Value;
Type valueType = value.GetType();
dt.Columns.Add(name, valueType);
}
}
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}

之后你就可以使用它了:

JsonSerializerSettings settings = new JsonSerializerSettings
{
Converters = new List<JsonConverter> { new SkipArrayConverter() }
};
const string JsonObject = @"[{Id:""672af604-495b-4dc0-933e-6c55f56bef82"",Name:""1"",MyArray:[{}]}]";
const string EndResultJsonObject = @"[{Id:""672af604-495b-4dc0-933e-6c55f56bef82"",""Name"":""1""}]";
var a = JsonConvert.DeserializeObject<DataTable>(JsonObject, settings);

Console.WriteLine(JsonConvert.SerializeObject(a));

a = JsonConvert.DeserializeObject<DataTable>(EndResultJsonObject, settings);

Console.WriteLine(JsonConvert.SerializeObject(a));

关于c# - JSON 到数据表忽略数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51559634/

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