我有一个大对象回来,我只需要一小部分数据。我在查看示例here。我本质上想要做同样的事情,除了问题是我会有一个“错误”对象数组。
所以,它看起来像这样
{
"short": {
"original": "http://www.foo.com/",
"short": "krehqk",
"error": [
{
"code": 0,
"msg": "No action taken"
},
{
"code": 0,
"msg": "No action taken"
}
]
}
}
有没有一种简单的方法可以使用JObject.Parse或甚至Linq到JSON来实现这一点?我最好只使用JsonConvert.DeserializeObject,而不是在我创建的.NET对象中不包含我不需要的属性/对象?
更新 使用上面的JSON是我的测试...
[TestMethod]
public void ParseStuffTest()
{
JObject json = JObject.Parse(shortJson);
Shortie shortie = new Shortie
{
Original = (string)json["short"]["original"],
Short = (string)json["short"]["short"],
Error = new ShortError
{
Code = (int)json["short"]["error"]["code"],
ErrorMessage = (string)json["short"]["error"]["msg"]
}
};
Assert.IsNotNull(shortie);
}
public class Shortie
{
[JsonProperty]
public string Original { get; set; }
[JsonProperty]
public string Short { get; set; }
[JsonProperty]
public List<ShortError> Error{ get; set; }
}
public class ShortError
{
[JsonProperty]
public int Code { get; set; }
[JsonProperty]
public string ErrorMessage { get; set; }
}
以下是错误:无法将类型'Unit_Tests.Test.ShortError'隐式转换为'System.Collections.Generic.List'
我错过了什么?
这就是我想出来的......我只是不喜欢它,因为我正在使用的真实对象要大得多,并且数组对象有多个属性。这是我唯一的选择吗??? (除了显而易见的JsonConvert.Deserialize)
[TestMethod]
public void ParseStuffTest()
{
JObject json = JObject.Parse(shortJson);
var errors = json["short"]["error"].Children().ToList();
var shortErrors = new List<ShortError>();
foreach (var error in errors)
{
var shortError = new ShortError
{
Code = (int)error["code"],
ErrorMessage = (string)error["msg"]
};
shortErrors.Add(shortError);
}
var shortie = new Shortie
{
Original = (string)json["short"]["original"],
Short = (string)json["short"]["short"],
Error = shortErrors
};
Assert.IsNotNull(shortie);
Assert.AreEqual(2, shortie.Error.Count);
}
答案 0 :(得分:5)
一位同事刚刚停下来,向我展示了使用Linq to JSON我想做什么......
[TestMethod]
public void ParseStuffTest()
{
JObject json = JObject.Parse(shortJson);
var shortie = new Shortie
{
Original = (string)json["short"]["original"],
Short = (string)json["short"]["short"],
Error = json["short"]["error"].ToList().Select(
c => new ShortError { Code = (int)c["code"], ErrorMessage = (string)c["msg"] }).ToList()
};
Assert.IsNotNull(shortie);
Assert.AreEqual(2, shortie.Error.Count);
}
没什么。 : - )
答案 1 :(得分:0)
如果您的目标类型(即,将其反序列化的类型)具有名为error的属性,该属性是List&lt;&gt;或数组,这仍然有效。在这种情况下,我会避免使用Linq(在我看来)它会增加不必要的开销,这对于序列化是完全没有必要的。
JavaScriptDeserializer(example)和Json类都是专门为此设计的,所以请利用这些工具。
如果您真的只想反序列化部分对象,则可以在反序列化之前对JSON源执行一些基本的字符串操作。在您的示例的情况下,搜索“错误”之间的所有内容:它匹配关闭']'并将其从您的JSON字符串中删除。