2015-11-02 6 views
0

Я уверен, что где-то есть простой ответ на мой вопрос, но я не мог его исправить. Проблема я столкнулся в следующем, у меня есть структура кода:Сериализация/десериализация вложенных объектов в плоской структуре

class Field 
{ 
    List<Block> Blocks {get;set;} 

    public static Field CreateField() 
    { 
     var A = new Block {Connector = new Connector()} 
     var B = new Block {Connector = new Connector()} 

     A.Connector.ConnectedTo.Add(B); 
     B.Connector.ConnectedTo.Add(A); 

     var field = new Field(); 
     field.Blocks = new List {A, B}; 

     return field; 
    } 
} 

class Block 
{ 
    Connector Connector {get;set;} 
} 

class Connector 
{ 
    List<Block> ConnectedTo {get;set;} 
} 

чем команды сериализации с помощью json.net:

JsonConvert.SerializeObject(Field.CreateField(), Formatting.Indented, new JsonSerializerSettings {PreserveReferencesHandling = PreserveReferencesHandling.Objects}); 

и выходной результат, как и ожидалось:

{ 
    "$id": "1", 
    "Blocks": [ 
     { 
      "$id": "2", 
      "Connector": { 
       "$id": "3", 
       "ConnectedTo": [ 
        { 
         "$id": "4", 
         "Connector":{ 
          "$id": "5", 
          "ConnectedTo": [ 
           { 
            "$ref": "2" 
           } 
          ] 
         } 
        } 
       ] 
      } 
     } 
    ] 
} 

Есть любой способ получить сериализацию следующим образом:

{ 
    "$id": "1", 
    "Blocks": [ 
     { 
      "$id": "2", 
      "Connector": { 
       "$id": "3", 
       "ConnectedTo": [ 
        { 
         "$ref": "4" 
        } 
       ] 
      } 
     }, 
     { 
      "$id": "4", 
      "Connector":{ 
       "$id": "5", 
       "ConnectedTo": [ 
        { 
         "$ref": "2" 
        } 
       ] 
      } 
     } 
    ] 
} 

Спасибо.

+0

Зачем вам это нужно сплющивать? Посмотрите, как вы можете сериализовать данные с круговыми ссылками здесь: http://johnnycode.com/2012/04/10/serializing-circular-references-with-json-net-and-entity-framework/ – Kvam

+0

Kvam, thanks для ответа. Сначала мне нужно, чтобы это было дружелюбным к человеку (пользователь должен иметь возможность открыть json-файл и изменить его), сейчас практически невозможно, где и как это происходит. Тогда выходной файл с 10-20 блоками выглядит практически невозможным для изменения с помощью json-пути, особенно когда нам нужно что-то заменить (процесс обновления версии). – Anton

ответ

0

№ В вашем втором примере $ref : 4 указывает на $id, который происходит позже в JSON. Json.Net не сможет десериализовать это - когда дело доходит до $ref, он ожидает, что сможет решить его до $id, который он уже видел.

Я бы порекомендовал пользователям не изменять JSON прямо в любом случае, если они не являются технически подкованными. Как я уже сказал, отвечая на многие вопросы, связанные с JSON на SO, очень легко получить формат, испорченный, если вы его вручную отредактируете - пропущенные кавычки или запятые, несогласованные фигурные скобки, недопустимый синтаксис, вы называете его. Что вы будете делать, если кто-нибудь его подтянет? Я думаю, что лучший вариант - сделать инструмент, который позволяет абстрактно манипулировать вашей структурой. Инструмент может десериализовать исходный JSON, разрешить определенные изменения и затем повторно инициализировать его в новую структуру. Пользователям не нужно было ничего знать о базовом формате JSON таким образом.

+0

Спасибо, это именно то, что я думал. – Anton

+0

Я согласен с тем, что разрешить пользователю изменять json-файл - это не очень хорошая идея, но это то, что клиент хотел бы иметь, и мы все еще спорим. Проблема с инструментом (или что-то еще) заключается в следующем: нам нужно будет сохранить все оригинальные модели для десериализации json-файлов правильно, и когда мы обновим наши ресурсы с v1 до v3, очень легко представить, сколько мусора нам нужно сохранить. Другая идея - работать с динамическими структурами, но я не уверен, насколько это легко или сложно, – Anton

Смежные вопросы