JSON-массив объектов в .NET Object - PullRequest
3 голосов
/ 28 января 2010

У меня возвращается большой объект, и мне нужна только часть данных. Я смотрел на пример здесь . По сути, я хочу сделать то же самое, но проблема в том, что у меня будет массив объектов "error".

Итак, это будет выглядеть так

{
    "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?

UPDATE Используя 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. Дезериализация)

[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 голосов
/ 29 января 2010

Сотрудник просто зашел и показал мне, что именно я хотел сделать, используя 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);
}

Ничего подобного. : -)

0 голосов
/ 28 января 2010

Если ваш целевой тип (то есть тип, к которому этот десериализуется) имеет свойство с именем error, представляющее собой List <> или массив, это все равно будет работать. В этом случае я бы избегал Linq, поскольку (на мой взгляд) он добавляет ненужные издержки, которые совершенно не нужны для сериализации.

И JavaScriptDeserializer ( пример ), и классы Json разработаны специально для этого, поэтому воспользуйтесь этими инструментами.

Если вы действительно хотите десериализовать только часть объекта, вы можете выполнить некоторые базовые манипуляции со строками в вашем источнике JSON перед десериализацией. В случае с вашим примером ищите все между «ошибкой»: и она совпадает с закрывающей «]» и удалите ее из вашей строки JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...