c# - 如何在 C# 中将值的 json 数组转换为嵌套的 json 对象
问题描述
我有一个 JSON 文件,其中一个值表示为整数列表,但我想将该列表转换为嵌套 JSONS,并使用其值和代理键(每个列表从 1 开始自动递增)。
是否可以将 Newtonsoft.json.dll 用于此任务?
这是实际的例子
{
"content": {
"table": [
{
"name": {
"en": "questionnaire"
},
"data": [
"154",
"124254",
"87575"
]
}
]
}
}
这是需要的输出:
{
"content": {
"table": [
{
"name": {
"en": "questionnaire"
},
"data": [
{
"id": "1",
"value": "154"
},
{
"id": "2",
"value": "124254"
},
{
"id": "3",
"value": "87575"
}
]
}
]
}
}
非常感谢您的任何想法。
解决方案
您可以创建一个自定义转换器,负责将data
数组转换为新的dictionary<string, string>
. 自定义转换器如下所示:
public class DataConverter : JsonConverter
{
private int _index = 1;
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
JToken token = JToken.FromObject(value);
token.WriteTo(writer);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
Dictionary<string, string> dict = new Dictionary<string, string>();
try
{
foreach (var item in token)
{
dict.Add(_index++.ToString(), item.ToString());//Filling the data to dictionary
}
}
catch
{
// ignored
}
_index = 1;//Resetting index
return dict;
}
public override bool CanConvert(Type objectType)
{
return objectType.IsAssignableFrom(typeof(IDictionary<string, string>));
}
}
然后你应该有如下模型,以便将 json 提取到强类型对象中。如您所见,此属性[JsonConverter(typeof(DataConverter))]
告诉转换器如何序列化/反序列化内容。
[Serializable]
public class Table
{
[JsonProperty("data")]
[JsonConverter(typeof(DataConverter))]
public Dictionary<string, string> Data { get; set; }
}
[Serializable]
public class Content
{
[JsonProperty("table")]
public Table[] Tables { get; set; }
}
[Serializable]
public class MyObject
{
[JsonProperty("content")]
public Content Content { get; set; }
}
这是一个简单的控制台应用程序来测试它: - 请注意,为了简单起见,我删除了表格下的所有其他内容,但您可以将它们添加到您的应用程序中。
public static void Main()
{
string content = @"{
""content"": {
""table"": [
{
""data"": [
""154"",
""124254"",
""87575""
]
}
]
}
}";
var result = JsonConvert.DeserializeObject<MyObject>(content);
foreach (var table in result.Content.Tables)
{
Console.WriteLine(JsonConvert.SerializeObject(table));
}
Console.ReadLine();
}
希望能帮助到你 :)
推荐阅读
- python - Anaconda基础环境VScode中无法导入库错误
- sqlite - 附加行之前的 SQLite 索引
- spring-boot - 如何定义递归 URL 消费逻辑
- getgauge - 如何在 taiko 中启动 chrome 浏览器而不是 chromium,因为我是 taiko 的新手
- python - 将文件保存到 Azure Blob 存储
- android - 在 Android Studio (java) 中使用 ConstraintLayout 实现弹出窗口
- c - winsock2:RAW SOCKET recvfrom() 返回错误 10022(无效参数)
- swift - 使用 NSBezierPath、CAShapeLayer 和 CAGradientLayer 绘制一条带渐变的线
- python - 解决四和问题的时间复杂度?
- jquery - 为什么使用带有 Angular/TypeScript 的 floatThead 会产生错误 Property 'floatThead' does not exist on type 'JQuery
'