2012-01-29 12 views
0

Я не уверен, что это можно сделать, в основном я изо всех сил пытаюсь отобразить объекты C# в json-канал.Json.net настроить узел, который должен быть неявным

проблема заключается в том, что текст json содержит имя объекта, которое на самом деле является уникальным идентификатором, означающим, что я не могу просто использовать один объект для сопоставления.

{ 
    "Persons": { 
     "12345": { 
      "surname": "smith", 
      "firstname": "jim" 
      "language": "en" 
     }, 
     "99999": { 
      "surname": "blog", 
      "firstname": "joe" 
      "language": "en" 
     }, 
     "87534": { 
      "surname": "bond", 
      "firstname": "james" 
      "language": "en" 
     } 
    } 
} 

Структура объекта У меня есть класс под названием Лица, содержащие свойство IList.

Как вы можете видеть, имена объектов на самом деле являются уникальными идентификаторами, но могут быть одного типа. У меня нет контроля над лентой json, поэтому я не могу просто отредактировать этот конец.

Есть ли что-нибудь, что я могу сделать, чтобы исправить это в json.net? возможно, атрибут ???

+0

ли я вас правильно понимаю, что вы используете 'JsonConvert.SerializeObject()'? Является ли вручную создание JSON для вас? – svick

+0

Это выглядит намного больше, чем «Словарь», чем «Список». –

ответ

0

Я не являюсь пользователем JSON.NET, поэтому прошу прощения, если это не применимо. Ваша структура JSON кажется, что было бы лучше соответствовать Dictionary<int, Person> коллекции, где Person определяется:

public class Person 
{ 
    public string surname { get; set; } 
    public string firstname { get; set; } 
    public string language { get; set; } 
} 

структуры иерархических данных, как правило, не очень хорошо сцепляются с List<T> коллекций.

0

Я только что открыл JSON.NET, поэтому не уверен, что то, что я говорю, на 100% точнее. Я не думаю, что вы можете использовать сериализацию, потому что, как вы указали, входная строка не является надлежащим JSON, поэтому код сериализации, скорее всего, захлебнется.

Так что вы хотите сделать, это сделать предварительную обработку и получить этот список в правильной форме, прежде чем продолжить работу над ним. Кажется, LINQ to JSON - идеальное решение для этого, поскольку LINQ позволяет вам манипулировать отдельными элементами по мере необходимости. Таким образом, вы можете взять имя свойства и воссоздать новый тип объекта, который содержит «id», значение которого совпадает с тем, что было раньше.

Я думаю, что это то, что вы хотите:

private void Test1() 
    { 
     string testInput = @"{ 
           ""Persons"": { 
            ""12345"": { 
             ""surname"": ""smith"", 
             ""firstname"": ""jim"", 
             ""language"": ""en"" 
            }, 
            ""99999"": { 
             ""surname"": ""blog"", 
             ""firstname"": ""joe"", 
             ""language"": ""en"" 
            }, 
            ""87534"": { 
             ""surname"": ""bond"", 
             ""firstname"": ""james"", 
             ""language"": ""en"" 
            } 
           } 
          }"; 

     JObject jsonPeople = JObject.Parse(testInput); 

     var query = from p in jsonPeople[ "Persons" ].Children().Cast<JProperty>() 
        select new JObject( 
         new object[] { new JProperty("id", p.Name) } 
         .Concat(p.Value.Children())); 

     JObject outJson = new JObject(new JProperty("Persons", query)); 

     System.Diagnostics.Debug.Print(outJson.ToString()); 
    } 
Смежные вопросы