2013-05-31 8 views
2

Приведенное ниже тип ответа JSON,JSON синтаксического анализа сложного объекта

{ 
    "?xml":{ 
    "@version":"1.0", 
    "@encoding":"iso-8859-1" 
    }, 
    "xmlreport":{ 
    "@title":"ABC: TEST Most Saved2", 
    "@dates":"Week of May 19,2013", 
    "columns":{ 
     "column":[ 
     { 
      "@name":"Page", 
      "@type":"dimension", 
      "#text":"Page" 
     }, 
     { 
      "@name":"Events", 
      "@type":"metric", 
      "@hastotals":"true", 
      "#text":"Events" 
     } 
     ] 
    }, 
    "rows":{ 
     "row":[ 
     { 
      "@rownum":"1", 
      "cell":[ 
      { 
       "@columnname":"page", 
       "@csv":"\"http://www.ABC.com/profile/recipebox\"", 
       "#text":"http://www.ABC.com/profile/recipebox" 
      }, 
      { 
       "@columnname":"events", 
       "@percentage":"\"0.1%\"", 
       "#text":"489" 
      } 
      ] 
     }, 
     { 
      "@rownum":"2", 
      "cell":[ 
      { 
       "@columnname":"page", 
       "@csv":"\"http://www.ABC.com/recipes/peanut-butter-truffle-brownies/c5c602e4-007b-43e0-aaab-2f9aed89524c\"", 
       "#text":"http://www.ABC.com/recip...c602e4-007b-43e0-aaab-2f9aed89524c" 
      }, 
      { 
       "@columnname":"events", 
       "@percentage":"\"0.0%\"", 
       "#text":"380" 
      } 
      ] 
     } 
     ] 
    }, 
    "totals":{ 
     "pagetotals":{ 
     "total":{ 
      "@columnname":"events", 
      "@value":"1820.000000", 
      "#text":"1,820 (0.2%)" 
     } 
     }, 
     "reporttotals":{ 
     "total":{ 
      "@columnname":"events", 
      "@value":"7838.000000", 
      "#text":"7,838 (0.8%)" 
     } 
     }, 
     "timeperiodtotals":{ 
     "total":{ 
      "@columnname":"events", 
      "@value":"955774.000000", 
      "#text":"955,774 (100.0%)" 
     } 
     } 
    } 
    } 
} 

Я не могу разобрать object.Could, пожалуйста, помогите мне, как я могу читать атрибуты и элементы после разбора. Я использую C#

{ 
    XmlDocument doc = new XmlDocument(); 
    doc.LoadXml(XML); 

    string jsonText = JsonConvert.SerializeXmlNode(doc); 
    //var result = Newtonsoft.Json.JsonConvert.DeserializeXmlNode(jsonText, "xmlreport"); 
    var results = JsonConvert.DeserializeObject<dynamic>(jsonText); 

    JToken token = JObject.Parse(jsonText); 
    var report = token["xmlreport"]; 
} 
+0

Это похоже на документ XML, преобразованный в JSON. Зачем? –

+0

@Eli Мы получаем этот xml, и нам нужно отправить его клиенту в формате json, поэтому его напрямую преобразовать из XML – Selwyn

+0

ok я его обновлю. – Selwyn

ответ

0

Один из способов сделать это - получить фактическую структуру данных этого объекта JSON, который у вас есть.

Затем создайте классы, представляющие эту структуру данных (если вы можете получить полный ответ - имея все свойства, просто используйте это site, чтобы преобразовать это в классы).

После этого десериализуйте этот объект JSON в свой класс, используя различные доступные библиотеки. Пример может быть one.

0

Используйте эту функцию (JSon.NET), а рекурсивная функция записывает все ключи и значения в окно вывода.

 [TestMethod] 
     public void ParseMePlease() 
     { 


      string s = @"{""?xml"":{""@version"":""1.0"",""@encoding"":""iso-8859-1""}, 
          ""xmlreport"":{""@title"":""ABC: TEST Most Saved2"",""@dates"":""Week of May 19,2013"", 
          ""columns"":{""column"":[{""@name"":""Page"",""@type"":""dimension"",""#text"":""Page""},{""@name"":""Events"",""@type"":""metric"",""@hastotals"":""true"",""#text"":""Events""}]}, 
          ""rows"": 
          {""row"":[{""@rownum"":""1"",""cell"":[{""@columnname"":""page"",""@csv"":""\""http://www.ABC.com/profile/recipebox\"""",""#text"":""http://www.ABC.com/profile/recipebox""},{""@columnname"":""events"",""@percentage"":""\""0.1%\"""",""#text"":""489""}]}, 
          {""@rownum"":""2"",""cell"":[{""@columnname"":""page"",""@csv"":""\""http://www.ABC.com/recipes/peanut-butter-truffle-brownies/c5c602e4-007b-43e0-aaab-2f9aed89524c\"""",""#text"":""http://www.ABC.com/recip...c602e4-007b-43e0-aaab-2f9aed89524c""},{""@columnname"":""events"",""@percentage"":""\""0.0%\"""",""#text"":""380""}]}]}, 
          ""totals"":{""pagetotals"":{""total"":{""@columnname"":""events"",""@value"":""1820.000000"",""#text"":""1,820 (0.2%)""}}, 
          ""reporttotals"":{""total"":{""@columnname"":""events"",""@value"":""7838.000000"",""#text"":""7,838 (0.8%)""}}, 
          ""timeperiodtotals"":{""total"":{""@columnname"":""events"",""@value"":""955774.000000"",""#text"":""955,774 (100.0%)""}}}}}";   
      var result=JsonConvert.DeserializeObject<object>(s); 

      Debug.WriteLine("Right Click Result on quick watch for Result Views!(On Debug)"+result.ToString()); 

      JObject jobject = ((Newtonsoft.Json.Linq.JObject)result); 


      PrintDetail(jobject); 

     } 

     public void PrintDetail(JObject node) 
     { 
      foreach (var item in node) 
      {      
       Debug.WriteLine("Key:" + item.Key + " Value:" + item.Value); 
       if (item.Value is JObject) 
       { 
        PrintDetail((JObject)item.Value); 
       } 
      } 
     } 
1

Мое понимание вопроса: у вас есть Xml, и вам нужно отправить json. Пара очков, прежде чем мы перейдем к коду:

1) Не преобразовывать XML непосредственно JSon как это вызывает проблемы

2) Разбираем XML к объектам на вашем конце, а затем разработать формат для возврата ; расцепления, что приходит и уходит позволит один из интерфейсов для изменения в будущем, не влияя на другие, как вы можете настроить отображение

Так, на код ...

По существу разбора XML в объекты для дальнейшей обработки, а затем вытеснить как json.

class Program 
{ 
    private static string starting = 
     "<xmlreport title=\"ABC: TEST Most Saved2\" dates=\"Week of May 19,2013\"><columns><column name=\"Page\" type=\"dimension\">Page</column><column name=\"Events\" type=\"metric\" hastotals=\"true\">Events</column></columns><rows><row rownum=\"1\"><cell columnname=\"page\" csv=\"http://www.ABC.com/profile/recipebox\">http://www.ABC.com/profile/recipebox</cell><cell columnname=\"events\" percentage=\"0.1%\">489</cell></row><row rownum=\"2\"><cell columnname=\"page\" csv=\"http://www.ABC.com/recipes/peanut-butter-truffle-brownies/c5c602e4-007b-43e0-aaab-2f9aed89524c\">http://www.ABC.com/recipes/peanut-butter-truffle-brownies/c5c602e4-007b-43e0-aaab-2f9aed89524c</cell><cell columnname=\"events\" percentage=\"0.0%\">380</cell></row></rows><totals><pagetotals><total columnname=\"events\" value=\"1820.00000\">1,820 (0.2%)</total></pagetotals><reporttotals><total columnname=\"events\" value=\"7838.000000\">7,838 (0.8%)</total></reporttotals><timeperiodtotals><total columnname=\"events\" value=\"955774.000000\">955,774 (100.0%)</total></timeperiodtotals></totals></xmlreport>"; 


    static void Main(string[] args) 
    { 
     // parse from xml to objects 
     StringReader reader = new StringReader(starting); 
     XmlSerializer xmlSerializer = new XmlSerializer(typeof(XmlReport)); 
     var xmlreport = (XmlReport)xmlSerializer.Deserialize(reader); 

     // todo: do some process mapping ... 

     // parse out as json 
     var json = JsonConvert.SerializeObject(xmlreport); 

     Console.WriteLine(json); 
     Console.ReadLine(); 
    } 
} 

[Serializable] 
[XmlRoot(ElementName = "xmlreport")] 
public class XmlReport 
{ 
    [XmlAttribute(AttributeName = "title")] 
    public string Title { get; set; } 
    [XmlAttribute(AttributeName = "dates")] 
    public string Dates { get; set; } 

    [XmlArray(ElementName = "columns")] 
    [XmlArrayItem(typeof(Column), ElementName = "column")] 
    public Collection<Column> Columns { get; set; } 
} 

[Serializable] 
public class Column 
{ 
    [XmlAttribute(AttributeName = "name")] 
    public string Name { get; set; } 
    [XmlAttribute(AttributeName = "type")] 
    public string Type { get; set; } 
} 

Я попытался разобрать JSON к исходному XML, чтобы начать с так извинения, если я не интерпретировать его правильно. Я не сделал всю структуру, но надеюсь, что приведенный выше пример дает вам представление о том, как сделать все остальное.

Надеюсь, что это поможет.

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