将JSON对象数组转换为.NET对象

3

我有一个大对象返回,但我只需要其中一小部分数据。我看了这个例子:这里。基本上我想做同样的事情,但问题是我会有一个“错误”对象的数组。

所以,它会像这样:

{
    "short": {
        "original": "http://www.foo.com/",
        "short": "krehqk",
        "error": [
            {
                "code": 0,
                "msg": "No action taken" 
            },
            {
                "code": 0,
                "msg": "No action taken" 
            }
        ] 
    }
}

使用JObject.Parse或Linq to 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);
}
2个回答

5

我的一位同事刚刚过来给我展示了如何使用Linq处理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);
}

没什么难的。:-)

0

如果您的目标类型(即正在进行反序列化的类型)具有名为error的List<>或数组属性,则仍将起作用。在这种情况下,我会避免使用Linq,因为(在我看来)它增加了完全不必要的开销,对于序列化来说是完全不必要的。

JavaScriptDeserializer(example)和Json类都是专门为此设计的,因此请利用这些工具。

如果您真的只想反序列化对象的一部分,可以在反序列化之前对JSON源执行一些基本的字符串操作。在您的示例中,搜索位于“error”:之间的所有内容以及其匹配的闭合']',并将其从JSON字符串中删除。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接