2016-01-31 1 views
0

У меня есть кусок кода, который генерирует XML-базу в файл «шаблон», все данные динамически взяты из проекта, базовый на текущий пользователь ..синтаксического анализа XML в JSON с пользовательскими изменения

И что мне нужно сделать, это отправить структуру структуры JSON в API (у меня нет контроля).

Проблема, с которой я столкнулся, заключается в том, что я не могу создать такой JSON (в правильном формате) из XML, используя JsonConvert.SerializeObject.

С помощью онлайнового инструмента у меня есть создает этот XML из этого JSON, JsonConvert.SerializeObject(XML) генерирует JSON, но вместо этого, например element, которые представляют элемент массива - мне нужно каждый элемент, чтобы быть в [], RootDTO корневой элемент , мне это совсем не нужно.

Итак, что мне нужно сделать, это превратить этот XML в JSON, который структурирован так, как JSON.

Возможно ли использование «json.net»? мне нужно написать "обычай serilizer"


XML-я есть сделать:

<?xml version="1.0" encoding="UTF-8"?> 
<RootDTO> 
    <destination> 
     <name>companyName</name> 
    </destination> 
    <orderData> 
     <amount>123.45</amount>  
     <items> 
     <element>    
      <binding>saddle</binding> 
      <components> 
       <element>        
        <width>210</width> 
       </element> 
      </components> 
      <description>Introductory x</description>   
     </element> 
     </items> 
    </orderData> 
</RootDTO> 

JSON JsonConvert.SerializeObject производства

{ 
    "?xml": { 
     "@version": "1.0", 
     "@encoding": "UTF-8" 
    }, 
    "RootDTO": { 
     "destination": { 
     "name": "companyName" 
     }, 
     "orderData": { 
     "amount": "123.45", 
     "items": { 
      "element": { 
       "binding": "saddle", 
       "components": { 
        "element": { 
        "width": "210" 
        } 
       }, 
       "description": "Introductory x" 
      } 
     } 
     } 
    } 
} 

Нужный JSON

{ 
    "destination": { 
    "name": "companyName" 
    }, 
    "orderData": { 
     "amount": "123.45", 
     "items": [ 
     { 
      "binding": "saddle", 
      "components": [ 
       { 
       "width": "210" 
       } 
      ], 
      "description": "Introductory x" 
     } 
     ] 
    } 
} 
+2

Вопросы, ищущих отладки помощи («? Почему не работает этот код») должен включать желаемого поведения, конкретной проблемы или ошибки и кратчайшего кода, необходимого для воспроизведения в самом вопросе. Вопросы без четкого описания проблемы не полезны другим читателям. См.: Как создать минимальный, полный и проверенный пример. – mybirthname

+0

Что это значит? Я разместил init XML и желаемый JSON, что я спрашиваю, как его разобрать ... с помощью JSON.NET или другого? как я могу объяснить это лучше? –

+0

этот вопрос уже был дан ответ: [проверить этот вопрос] (http://stackoverflow.com/questions/814001/convert-json-to-xml-or-xml-to-json-by-using-json-net) –

ответ

1

У вас есть следующие проблемы:

  1. Вы не хотите корневой элемент.

    Это легко удалить, используйте JsonConvert.SerializeXNode Method(XObject, Formatting, omitRootObject = true) или установите XmlNodeConverter.OmitRootObject = true.

  2. Элементы не возвращаются как массивы JSON.

    Существует фундаментальное несоответствие между XML и JSON в том, что XML не имеет концепции массива. Он просто имеет последовательности элементов с именами. Итак, при каких обстоятельствах Json.NET создает массивы? От Converting between JSON and XML:

    Несколько узлов с одинаковым именем на одном уровне сгруппированы в массив.

    Однако то, что у вас есть список двухуровневый, например, так:

    <Container> 
        <element> 
        </element> 
        <!-- Repeat as necessary --> 
    </Container> 
    

    Json.NET не будет автоматически распознавать элемент контейнера в виде массива, таким образом, вам необходимо будет предварительно процесс в XML с LINQ to XML или пост-процесс с LINQ to JSON. Я думаю, что последнее проще.К счастью, все ваши записи в списке называются element, что делает пост-обработку простой. Это можно сделать с помощью следующих двух методов расширения:

    public static class JsonExtensions 
    { 
        public static JObject ToJObject(this XDocument xDoc) 
        { 
         // Convert to Linq to XML JObject 
         var settings = new JsonSerializerSettings { Converters = new[] { new XmlNodeConverter { OmitRootObject = true } } }; 
         var root = JObject.FromObject(xDoc, JsonSerializer.CreateDefault(settings)); 
    
         // Convert two-level lists with "element" nodes to arrays. 
         var groups = root.Descendants() 
          .OfType<JProperty>() 
          .Where(p => p.Name == "element") 
          .GroupBy(p => (JObject)p.Parent) 
          .Where(g => g.Key.Parent != null && g.Key.Properties().Count() == g.Count()) 
          .ToList(); 
         foreach (var g in groups) 
         { 
          // Remove values from properties to prevent cloning 
          var values = g.Select(p => p.Value) 
           .SelectMany(v => v.Type == JTokenType.Array ? v.Children().AsEnumerable() : new[] { v }) 
           .ToList() 
           .Select(v => v.RemoveFromLowestPossibleParent()); 
          g.Key.Replace(new JArray(values)); 
         } 
         return root; 
        } 
    
        public static JToken RemoveFromLowestPossibleParent(this JToken node) 
        { 
         if (node == null) 
          throw new ArgumentNullException("node"); 
         var contained = node.AncestorsAndSelf().Where(t => t.Parent is JContainer && t.Parent.Type != JTokenType.Property).FirstOrDefault(); 
         if (contained != null) 
          contained.Remove(); 
         // Also detach the node from its immediate containing property -- Remove() does not do this even though it seems like it should 
         if (node.Parent is JProperty) 
          ((JProperty)node.Parent).Value = null; 
         return node; 
        } 
    } 
    

    Тогда просто сделать:

    var xDoc = XDocument.Parse(xmlString); 
        var root = xDoc.ToJObject(); 
        var jsonString = root.ToString(); 
    
+0

Спасибо @dbc - относительно массива, который не создается из XML-> JSON, я столкнулся с этим сообщением: [link] (http://stackoverflow.com/questions/14488662/json-net-xml-serialization-misunderstands- массивов) кажется, что если реализовать это решение, то, что осталось сделать, это удалить тег '', кажется, что это более простое решение. Можете ли вы высказать свое мнение по этому поводу? –

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