【问题标题】:C#, json serialize a list within a list without square bracketsC#,json序列化列表中的列表,不带方括号
【发布时间】:2023-02-23 18:43:39
【问题描述】:

要与 API 集成,我需要我的 C# 输出以下 json:

"fields": {  
    "name1": {  
        "key1": "value1",
        "key2": "value2"
    },
    "name2": {  
        "key3": "value3",
        "key4": "value4"
    },
    "etc..."
}

我不明白如何设置它。 目前我正在使用一个类,然后将其序列化:JsonConvert.SerializeObject(document)

我尝试了以下代码:

public class Fields
{
    public string Name { get; internal set; }
         
    public Field myField { get; internal set; }

    public class Field
    {
        public string Value { get; internal set; }

        public string Key { get; internal set; }

        public Field(string value, string key)
        {
            Value = value;
            Key = key;
        }
    }

    public Fields(string name, Field myField)
    {
        Name = name;
        this.myField = myField;
    }
}
List<Fields> myFields = new List<Fields>();

foreach (var field in recipient.Fields)
    {
        myFields.Add(new Fields(field, new Fields.Field(name, value)));
    }

document.Fields = myFields;

但这导致:

"fields": [
    {
      "Name": "name1",
      "myField": {
        "key1": "value1",
        "key2": "value2"
      }
    },
    {
      "Name": "name1",
      "myField": {
        "key3": "value3",
        "key4": "value4"
      }
    }
]

字段集合周围的方括号需要去掉,其中显示“myField”的地方应替换为变量“name1”、“name2”等。名称可能会重复。
我可以用给定的变量手动创建正确的字符串,但我觉得必须有更好、“正确”的方法来实现这一点。

【问题讨论】:

  • 您需要使用字符串字段字典而不是列表

标签: c# json


【解决方案1】:

您可以使用 Dictionary&lt;string, Dictionary&lt;string, string&gt;&gt; 并创建具有此结构的模型:

public class Fields
{
    public Dictionary<string, Dictionary<string, string>> Items { get; set; }
}

将字典序列化为 JSON 时,键用作属性名称,值用作属性值。因此,要在您的代码中重现您的 JSON 结构,您需要按如下方式初始化模型:

var fields = new Fields();

var item1 = new Dictionary<string, string>()
{
    ["key1"] = "value1",
    ["key2"] = "value2"
};

var item2 = new Dictionary<string, string>()
{
    ["key3"] = "value3",
    ["key4"] = "value4"
};

fields.Items = new Dictionary<string, Dictionary<string, string>>()
{
    ["name1"] = item1,
    ["name2"] = item2,
};

更新:如果你需要一个以“重复”字符串作为键的字典,你可以使用解决方法来解决这个问题,并创建一个带有自定义IEqualityComparer 的字典,无论它们的值如何,它都不会认为两个字符串相同:

public class EveryStringIsUniqueueComparer : IEqualityComparer<string>
{
    public bool Equals(string x, string y) => false;
    public int GetHashCode(string obj) => Random.Shared.Next();
}

var item1 = new Dictionary<string, string>(new EveryStringIsUniqueueComparer())
{
    ["key1"] = "value1",
    ["key1"] = "value2",
    ["key1"] = "value3",
};

【讨论】:

  • 谢谢您的解答!但恐怕这并不能完全解决它。我应该指定,但名称可能不是唯一的。可能会有重复,据我所知,字典是不可能的。
  • 我认为在 json 中重复键值是一个单独的问题,需要一个单独的解决方案(如果需要的话,它会使反序列化严重复杂化)。但是您可以使用带有自定义 learn.microsoft.com/en-us/dotnet/api/… 的字典。
  • 谢谢你!我会调查一下。
猜你喜欢
  • 2021-11-02
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多