2016-10-10 2 views
2

У меня нет проблемы десериализации JSON в известных типах или в словарных объектах, но как насчет случаев, когда я не знаю, каким будет вход? В частности, я имею в виду получение строку JSON, которая представляет собой плоскую или вложенную набор пар ключ-значение:Deserializing any using JSON.NET

{ 
    foo: 'bar', 
    baz: 42 
} 

или

{ 
    foo: 
    { 
    bar: 42, 
    baz: ['foo', 'bar', 'baz'] 
    } 
} 

Но что о случаях, когда вход не является ключевым -value-pair, а скорее массив или массив объектов с другими вложенными объектами (включая массивы)?

[ 
    { foo: 'bar', baz: [ 1, 2, 3 ] }, 
    { foo: 'baz', bar: [ 4, 5, 6 ] } 
] 

Моя цель состоит в том, чтобы иметь единственный класс, который я мог десериализацию из вышеперечисленной в, а затем итерации каждый из ее членов. Вход может быть любой структуры, поэтому я не могу предположить, что данные будут соответствовать любому типу, который я уже определил.

Я не смог найти способ сделать это. У кого-нибудь есть какие-либо рекомендации?

Edit:

Кажется достаточно легко JToken.Parse строку JSON; полезным следующим шагом было бы перебрать его элементы и обработать JArray и JObject отдельно.

+0

Рассматривали ли вы deserialising в динамический? http://stackoverflow.com/questions/4535840/deserialize-json-object-into-dynamic-object-using-json-net –

+0

Да, я не могу заставить его работать, когда вход представляет собой массив без ключ. – joelc

+0

Что вы подразумеваете под массивом без ключа? – Abion47

ответ

3

То, что вы описываете, уже существует в Json.Net - это LINQ-to-JSON API (JTokens). Ниже приведен пример его использования для разбора произвольного JSON и итерации через члены. Обратите внимание, что для этого вам нужен рекурсивный метод, поскольку JSON может быть вложен на любую глубину.

using Newtonsoft.Json.Linq; 
public class Program 
{ 
    public static void Main(string[] args) 
    { 
     string json1 = @" 
     { 
      ""foo"": { ""bar"": 42, ""baz"": [ ""a"", ""b"", ""c"" ] } 
     }"; 
     DeserializeAndDump(json1, "example 1"); 

     string json2 = @" 
     [ 
      { ""foo"": ""bar"", ""baz"": [ 1, 2, 3 ] }, 
      { ""foo"": ""baz"", ""bar"": [ 4, 5, 6 ] } 
     ]"; 
     DeserializeAndDump(json2, "example 2"); 
    } 

    public static void DeserializeAndDump(string json, string label) 
    { 
     Console.WriteLine("---- " + label + " ----"); 
     JToken token = JToken.Parse(json); 
     DumpJToken(token); 
     Console.WriteLine(); 
    } 

    public static void DumpJToken(JToken token, string indent = "") 
    { 
     if (token.Type == JTokenType.Object) 
     { 
      Console.WriteLine(indent + "begin object"); 
      foreach (JProperty prop in token.Children<JProperty>()) 
      { 
       Console.WriteLine(indent + " " + prop.Name + ":"); 
       DumpJToken(prop.Value, indent + " "); 
      } 
      Console.WriteLine(indent + "end object"); 
     } 
     else if (token.Type == JTokenType.Array) 
     { 
      Console.WriteLine(indent + "begin array"); 
      foreach (JToken child in token.Children()) 
      { 
       DumpJToken(child, indent + " "); 
      } 
      Console.WriteLine(indent + "end array"); 
     } 
     else 
     { 
      Console.WriteLine(indent + token.ToString() + " (" + token.Type.ToString() + ")"); 
     } 
    } 
} 

Вот выход из вышеперечисленного:

---- example 1 ---- 
begin object 
    foo: 
    begin object 
     bar: 
     42 (Integer) 
     baz: 
     begin array 
      a (String) 
      b (String) 
      c (String) 
     end array 
    end object 
end object 

---- example 2 ---- 
begin array 
    begin object 
    foo: 
     bar (String) 
    baz: 
     begin array 
     1 (Integer) 
     2 (Integer) 
     3 (Integer) 
     end array 
    end object 
    begin object 
    foo: 
     baz (String) 
    bar: 
     begin array 
     4 (Integer) 
     5 (Integer) 
     6 (Integer) 
     end array 
    end object 
end array 

Fiddle: https://dotnetfiddle.net/dfk0sj

+1

Брайан благодарит вас за прекрасный пример. Я очень ценю время, которое вы сделали для этого. – joelc

+1

Нет проблем; Рад, что смог помочь. –

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

  • Нет связанных вопросов^_^