序列化C#自定义对象列表

时间:2015-10-01 12:56:14

标签: c# json serialization json.net json-deserialization

我从API接收一个JSON字符串,其结构不是在App中处理的好方法。

我选择为此JSON数据创建自定义序列化程序(而不是为应用程序中接收和使用的数据设置两个不同的类)。

经过大量教程后,我设法为单个对象组装了一个自定义序列化程序。但是,我需要处理这些对象的列表(这些奇怪的列表中会有更多不同的数据,需要自定义处理)。

是否有内置方式我可以设置我的自定义序列化程序来处理列表中的每个对象?或者我是否需要手动拆分JSON对象,并将其块提供给自定义序列化器?

对于如何处理这种情况的任何其他建议表示赞赏。

用户类:

[JsonConverter(typeof(UserSerializer))]
    public class User
    {
        public int id;
        public string displayName;
        public string email;
        public int total_points;
        public float total_values;
    }

deserialiser:

public override object ReadJson(JsonReader reader, Type objectType, 
            object existingValue, JsonSerializer serializer)
        {
            JObject jObjectRoot = JObject.Load(reader);
            var root = jObjectRoot.Properties().ToList();
            JObject jObjectData = JObject.Load(root[2].Value.CreateReader());
            var data = jObjectData.Properties().ToList();
            return new User { 
                id = (int)root[1].Value,
                displayName = (string)data[0].Value,
                email = (string)data[1].Value,
                total_points = (int)data[2].Value,
                total_values = (float)data[3].Value
            };
        }

更新:

也是将json字符串解析为单个用户对象的代码:

public static void ProcessJSON(string json)
{
    User user = JsonConvert.DeserializeObject<User>(json);
}

JSON本身:

[
  {
    "type": "users",
    "id": 1,
    "attr": {
      "display_name": "user2",
      "email": "user2@email.com",
      "total_points": 4,
      "total_values": 32.34
    },
    "relationships": {
      "points_received": {
        "links": {
          "self": "tipjar/users/1/relationships/points",
          "related": "tipjar/users/1/points"
        }
      },
      "points_given": {
        "links": {
          "self": "tipjar/users/1/relationships/awarded",
          "related": "tipjar/users/1/awarded"
        }
      }
    }
  }
]

由于

2 个答案:

答案 0 :(得分:2)

您可以在不使用自定义转换器的情况下获取用户对象列表:

var userList = JArray.Parse(json)
    .Select(t => new User()
    {
        id = int.Parse(t["id"].ToString()),
        displayName = t["attr"]["display_name"].ToString(),
        email = t["attr"]["email"].ToString(),
        total_points = int.Parse(t["attr"]["total_points"].ToString()),
        total_values = float.Parse(t["attr"]["total_values"].ToString()),
    }).ToList();

答案 1 :(得分:-1)

public static void ProcessJSON(string json)
{
    User u = new User();
    var test = JsonConvert.DeserializeObject(json);
    if (test.GetType() == typeof(User))
        u = (User)test;

}

关于序列化的工作方式不是100%,但这似乎对我制作的测试应用有效。

可能有点傻。但是你可以测试返回的不同类型的对象......