2014-12-29 6 views
0
var test = new 
      { 
       TestStr = "test", 
       TestNumber = 123, 
       TestDate = new DateTime(1986, 1, 13, 17, 50, 31), 
       TestBool = true 
      }; 

var xml = JsonConvert.DeserializeXNode(JsonConvert.SerializeObject(test), "test"); 

Этот код возврата хороший XML элемент:возвращение из JsonConvert.SerializeXNode JSON с правильным типом

<test> 
    <TestDate>1986-01-13T14:50:31Z</TestDate> 
    <TestBool>true</TestBool> 
    <TestNumber>123</TestNumber> 
    <TestStr>test</TestStr> 
</test> 

Когда я пытаюсь преобразовать это XML обратно в формат JSON:

var json = JsonConvert.SerializeXNode(xml, Formatting.None, true); 

я получаю JSON только с String.

Что мне делать, чтобы получить json с соответствующими типами?

+0

возможно дубликат [? Json.NET, может SerializeXmlNode быть расширен для обнаружения числа] (http://stackoverflow.com/questions/22770871/json-net-can-serializexmlnode-be-extended-to-detect-numbers) –

ответ

3

JSON и XML - это разные форматы сериализации и имеют разные возможности. JSON может различать string, number и boolean, тогда как XML обрабатывает все как строку. Поэтому, когда вы конвертируете из JSON в XML и обратно, информация о типе теряется. Один из способов справиться с этим - использовать сильно типизированную промежуточную модель при преобразовании взад и вперед. Другими словами, вместо преобразования непосредственно из XML в JSON десериализуйте свой XML в модель, затем сериализуйте модель в JSON. Модель заставит данные быть правильными типами.

Вот пример:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string xml = @" 
     <test> 
      <TestDate>1986-01-13T14:50:31Z</TestDate> 
      <TestBool>true</TestBool> 
      <TestNumber>123</TestNumber> 
      <TestStr>test</TestStr> 
     </test>"; 

     XmlSerializer ser = new XmlSerializer(typeof(Test)); 
     Test test = (Test)ser.Deserialize(new StringReader(xml)); 
     string json = JsonConvert.SerializeObject(test, Formatting.Indented); 
     Console.WriteLine(json); 
    } 
} 

[XmlType("test")] 
public class Test 
{ 
    public string TestStr { get; set; } 
    public int TestNumber { get; set; } 
    public DateTime TestDate { get; set; } 
    public bool TestBool { get; set; } 
} 

Выход:

{ 
    "TestStr": "test", 
    "TestNumber": 123, 
    "TestDate": "1986-01-13T14:50:31Z", 
    "TestBool": true 
} 
+0

Спасибо, мне нравится ваш ответ, но «динамический» - это ключ. У меня нет информации о типах. –

+0

Если у вас нет информации о типах, то лучшее, что вы можете сделать, это написать собственный код, чтобы попытаться угадать тип, основанный на значении данных. Однако это проблематично, потому что вы можете столкнуться с ситуацией, когда значение является числовым, но вы все еще хотите, чтобы с ним обрабатывалась строка. Хорошим примером являются почтовые коды США, которые в некоторых случаях имеют начальный ноль. Автоматическое преобразование строки в int приведет к отбрасыванию начального нуля и изменению значения. Вот почему Json.Net не пытается автоматически угадывать типы при конвертации из XML в JSON. –

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