将集合序列化为 JSON 对象数组所需的对象结构



我想使用 JSON.Net 将复杂的C#.net对象序列化为JSON。 类结构很灵活(完全在我的控制之下(,但需要特定格式的 JSON 才能与其他应用程序通信。 我需要以下格式的 JSON,但需要帮助组成类和嵌套集合:

{
"Record_1": [  {  "key_1": "value_1", "key_N": "value_N"},   {  "key_1": "value_1", "key_N": "value_N"}],
"Record_2": [  {  "key_1": "value_1" } ],
"Record_N": [  {  "key_1": "value_1" } , { "key_N":"value_N"}],
… Other properties (simple string key value pairs)
}
  • 将有 1 个或多个 Record 属性,每个Record的值是一个对象数组。
  • Record属性名称未知(我有一个可能性列表,但不想将它们硬编码到应用程序中(。
  • 每个数组中将有 1 个或多个对象。
  • 数组中的对象将具有 1 个或多个字符串键值对。 同样,属性名称在编译时是未知的。

由于记录属性未知,我尝试使用用 [JsonExtensionData] 注释的对象字典(字典<字符串,对象>(。 字典中的值对象是另一个集合。但是,这会导致具有对象值的字符串属性:

"Record_1": { key_1: [ value_1, value_2, value_N] }, "Record_N": { key_1: [value_1]  }

关闭,但不正确,记录的值必须是一个数组。

接下来,我尝试使用对象列表列表,但这也不起作用,因为列表的变量名称作为属性名称返回:

"RecordSet": [
{
"Records": [
{
"Key_1": "Value_1"
}
]
},
{
"Records": [
{
"Key_1": "Value_1",
}
]
}
]

因此,这确实会产生数组对象,但对象的内容格式不正确。

我相信我需要在我的类中嵌套集合的某种组合才能以所需的 JSON 格式输出记录,但我不知道是哪个。 希望其他人以前遇到过这种情况。

顺便说一句:目前,我直接写入 JSON 对象以获取所需的结构。我希望序列化的重构会有一些性能提高。 我不想只是增加复杂性,所以我可以说我遵循的是面向对象的编码原则。 永远不需要将此 JSON 反序列化回对象。

更新了答案(请参阅注释以了解原因(:

匹配 JSON 的结构是Dictionary<string, List<Dictionary<string, string>>>。 您必须弄清楚如何为第一个字典键填充所需的属性名称。 对此的一个建议是有一个接口,类似于ICanSerializeToSpecificJSONFormat,然后让所有类实现该接口,并使用将所需属性转换为此结构的方法。

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
namespace SomeNamespace
{
class Program
{
static void Main()
{
var d1 = new Dictionary<string, string>
{
{ "key_1", "value_1" }
};
var d2 = new Dictionary<string, string>(d1)
{
{ "key_2", "value_2" }
};
var objectToSerialize = new Dictionary<string, List<Dictionary<string, string>>>
{
{ "Record_1", new List<Dictionary<string, string>> { d1, d2 } },
{ "Record_2", new List<Dictionary<string, string>> { d1 } }
};
string recordsAsJson = JsonConvert.SerializeObject(objectToSerialize);
Console.WriteLine(recordsAsJson);
// prints: 
//  {"Record_1":[{"key_1":"value_1"},{"key_1":"value_1","key_2":"value_2"}],"Record_2":[{"key_1":"value_1"}]}
}
}
}

原答案:

你很接近。 您尝试了Dictionary<>List<List<>>,但您需要List<Dictionary<>>. 下面是一个完整的编译示例:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
namespace SomeNamespace
{
class RecordSet
{
public List<Dictionary<string, string>> Record_1 { get; set; }
public List<Dictionary<string, string>> Record_2 { get; set; }
}
class Program
{
static void Main()
{
var d1 = new Dictionary<string, string>
{
{ "key_1", "value_1" }
};
var d2 = new Dictionary<string, string>(d1)
{
{ "key_2", "value_2" }
};
var records = new RecordSet
{
Record_1 = new List<Dictionary<string, string>> { d1, d2 },
Record_2 = new List<Dictionary<string, string>> { d1 }
};
string recordsAsJson = JsonConvert.SerializeObject(records);
Console.WriteLine(recordsAsJson);
// prints: 
//  {"Record_1":[{"key_1":"value_1"},{"key_1":"value_1","key_2":"value_2"}],"Record_2":[{"key_1":"value_1"}]}
}
}
}

希望您可以将其用作创建自己的RecordSet类的指南(例如,修改以添加您提到的"其他属性"(。

最新更新