如何获得Json嵌套属性为主一个

本文关键字:一个 何获得 Json 嵌套 属性 | 更新日期: 2023-09-27 18:06:25

我有以下场景:

这是我的类结构:

public class User
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public System.Collections.ObjectModel.Collection<Likes> Likes { get; set; }
}
public class Likes
{
    public string Sport { get; set; }
    public string Music { get; set; }
    public string Food { get; set; }
    public string Place { get; set; }

}

当我序列化User类的对象时,它将生成以下json字符串:

{"FirstName":"Naresh",
 "LastName":"Parmar",
 "Likes": [{"Sport":"Cricket",
            "Music":"Classic",
            "Food":"Gujarati",
             "Place":"India"}]
}

我想生成上面的json字符串,如下所示:

{"FirstName":"Naresh",
 "LastName":"Parmar",
 "Sport":"Cricket",
 "Music":"Classic",
 "Food":"Gujarati",
 "Place":"India"
}

我想要嵌套的属性为主属性。

任何帮助都会很感激。

Thanks in advance.

编辑:

 {"FirstName":"Naresh",
  "LastName":"Parmar",
  "Sport":"Cricket,Chess,Football",
  "Music":"Classic",
  "Food":"Gujarati",
  "Place":"India"
  }

如何获得Json嵌套属性为主一个

这是非常糟糕的做法,因为我将在下面发布的代码没有很好的可维护性,但是如果这就是你所寻找的,你可以使用它。另一个类具有您想要的格式,并且有一个方法将喜欢的列表添加到您需要的格式中。你应该序列化为JSON的类:

    class NestedUser
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Sport { get; set; }
        public string Music { get; set; }
        public string Food { get; set; }
        public string Place { get; set; }
        public void AddLikes(System.Collections.ObjectModel.Collection<Likes> likes)
        {
            foreach (Likes like in likes)
            {
                Sport += like.Sport + ",";
                Music += like.Music + ",";
                Food += like.Food + ",";
                Place += like.Place + ",";
            }
            if (Sport != string.Empty)
            {
                Sport = Sport.Substring(0, Sport.Length - 1);
            }
            if (Music != string.Empty)
            {
                Music = Music.Substring(0, Music.Length - 1);
            }
            if (Food != string.Empty)
            {
                Food = Food.Substring(0, Food.Length - 1);
            }
            if (Place != string.Empty)
            {
                Place = Place.Substring(0, Place.Length - 1);
            }
        }
    }

由于它不仅限于喜欢对象,我建议使用动态对象。所以我建议的User类如下:

public class User
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public dynamic Details { get; set; }
    public User()
    {
        Details = new ExpandoObject();
    }
    public void AddSingleDetail(string key, string value)
    {
        var dict = this.Details as IDictionary<string, Object>;
        if (dict.ContainsKey(key))
        {
            dict[key] += "," + value;
        }
        else
        {
            dict[key] = value;
        }
    }
    public void AddDetails(object detailsObject)
    {
        var type = detailsObject.GetType();
        foreach (var prop in type.GetProperties())
        {
            AddSingleDetail(prop.Name, prop.GetValue(detailsObject).ToString());
        }
    }
}

您可以使用它来添加单个属性或添加一个对象作为一个整体。我使用反射来获取所有属性名称和值,并将它们添加到用户详细信息中。

示例用法:

static void Main(string[] args)
{
    var user1 = new User() { FirstName = "Homer", LastName = "Simpson" };
    user1.AddSingleDetail("Sport", "Bowling");
    user1.AddSingleDetail("Sport", "Sleeping");
    user1.AddSingleDetail("Food", "Donut");
    user1.AddSingleDetail("Music", "Rock");
    string flattenedHomer1 = ConvertUserToFlattenedJson(user1);
    var user2 = new User() { FirstName = "Homer", LastName = "Simpson" };
    var likes1 = new Likes() { Food = "Donut", Music = "Rock", Place = "Springfield", Sport = "Bowling" };
    var likes2 = new Likes() { Food = "Steaks", Music = "Metal", Place = "Evergreen Terrace", Sport = "Sleeping" };
    var proStuff = new ProfessionalStuff() { Title = "Boss" };
    user2.AddDetails(likes1);
    user2.AddDetails(likes2);
    user2.AddDetails(proStuff);
    string flattenedHomer2 = ConvertUserToFlattenedJson(user2);
}

执行JSON转换的方法是:

public static string ConvertUserToFlattenedJson(User u)
{
    dynamic flatUser = new ExpandoObject();
    flatUser.FirstName = u.FirstName;
    flatUser.LastName = u.LastName;
    var dict = u.Details as IDictionary<string, Object>;
    foreach (var like in dict)
    {
        ((IDictionary<string, Object>)flatUser)[like.Key] = like.Value;
    }
    string json = Newtonsoft.Json.JsonConvert.SerializeObject(flatUser);
    return json;
}

在上面的示例中,user2被转换为以下JSON字符串,我相信这是您正在寻找的:

{
  "FirstName": "Homer",
  "LastName": "Simpson",
  "Sport": "Bowling,Sleeping",
  "Music": "Rock,Metal",
  "Food": "Donut,Steaks",
  "Place": "Springfield,Evergreen Terrace",
  "Title": "Boss"
}

在连接字符串时,您可以检查空值或重复值。我没有处理那部分。

为了完整起见,下面是我创建的ProfessionalStuff类:

public class ProfessionalStuff
{
    public string Title { get; set; }
}