如何将Json嵌套属性转换为主要属性

时间:2015-08-05 12:48:31

标签: c# json serialization nested-attributes

我有以下情况:

这是我的班级结构:

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"
}

我希望嵌套属性为主要属性。

任何帮助将不胜感激。

提前致谢..

修改

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

2 个答案:

答案 0 :(得分:0)

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

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());
        }
    }
}

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

样本用法:

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; }
}

希望这有帮助。

答案 1 :(得分:0)

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

<Canvas Background="White"  x:Name="canvas" MouseLeftButtonDown="CanvasDownHandler" MouseMove="CanvasMoveHandler" MouseLeftButtonUp="CanvasUpHandler" ClipToBounds=true>