如何在反序列化数组时获取对象json

时间:2015-04-01 14:08:35

标签: c# json serialization json.net

我有一个传入的JSON,它包含一些对象的数组,比如Foo。我用

反序列化它们
result = JsonConvert.DeserializeObject<List<Foo>>(message);

现在我想向Foo添加一个字符串属性,它将存储它的JSON(我收到的),以便Foo看起来像:

    public class Foo
{
    public int MyInt { get; set; }
    public bool MyBool { get; set; }
    public string JSON { get; set; }
}

但是我不知道怎么能说JSON.Net可以填充这样一个领域..

UPD 我会清楚自己想要什么。假设我收到JSON:

[{"MyInt":1,"MyBool":0},{"MyInt":2,"MyBool":0},{"MyInt":3,"MyBool":1}]

这是3个对象的数组,我希望在反序列化时将json的相应部分添加到object中,以便:

第一个对象将包含{"MyInt":1,"MyBool":0}

第二个对象将包含{"MyInt":2,"MyBool":0}

第三个对象将包含{"MyInt":3,"MyBool":1}

在他们的JSON财产

我会感激任何帮助!

2 个答案:

答案 0 :(得分:1)

这是一种方法,但它不能保持原始的JSON - 但它确实提供了原始JSON的静态记录(但没有原始值的确切格式 - 即Bool可能是0 / 1或真/假):

var message = @"[{""MyInt"":1,""MyBool"":0},{""MyInt"":2,""MyBool"":0},{""MyInt"":3,""MyBool"":1}]";
var foos = JsonConvert.DeserializeObject<List<Foo>>(message);
var t = JsonConvert.SerializeObject(foos[0]);
foos = foos.Select(s => new Foo() { MyBool = s.MyBool, MyInt = s.MyInt, JSON = JsonConvert.SerializeObject(s) }).ToList();

如果你正在处理很多Foos,那么你可能想找到一种更有效的方法。可能有一种方法可以使用linq“更新”,而不是创建新列表。

答案 1 :(得分:0)

好的,我找到了答案。我不知道我可以将消息反序列化为JArray然后枚举它(好工作,newtonsoft :))。以下是我的努力:

if (tokenType is JArray)
                {
                    var arr = JsonConvert.DeserializeObject(message) as JArray;
                    foreach (var item in arr)
                    {
                        try
                        {
                            var agentParameter = item.ToObject<Foo>();
                            agentParameter.JSON = item.ToString();
                            result.Add(agentParameter);
                        }
                        catch (Exception)
                        {
                            LogProvider.Error(string.Format("Failed to Deserialize message. Message text: \r\n {0}", item.ToString()));
                        }
                    }
                }