2014-12-10 6 views
0

Прежде чем отмечать это как дубликат, я хотел бы сказать, что у меня есть собственная реализация JsonObject, и именно поэтому я прошу дать указания здесь.Разбирать массив JSON из строки JSON?

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

class JsonObject 
{ 
    public struct JsonProperty 
    { 
     public String Name { get; set; } 
     public String Value { get; set; } 
    } 

    public Dictionary<String, JsonProperty> Properties; 

    public JsonObject() 
    { 
     Properties = new Dictionary<String, JsonProperty>(); 
    } 

    public JsonObject(String jsonString) 
    { 
     Properties = new Dictionary<String, JsonProperty>(); 
     ParseString(jsonString); 
    } 

    public JsonObject(List<String> properties) 
    { 
     Properties = new Dictionary<String, JsonProperty>(); 
     foreach (String s in properties) 
     { 
      String[] keyvaluepair = s.Split(':'); 
      JsonProperty prop = new JsonProperty(); 
      prop.Name = keyvaluepair[0]; 
      prop.Value = keyvaluepair[1]; 

      Properties.Add(prop.Name, prop); 
     } 
    } 

    public void AddProperty(String name, String value) 
    { 
     JsonProperty prop = new JsonProperty(); 
     prop.Name = name; 
     prop.Value = value; 

     Properties.Add(prop.Name, prop); 
    } 

    private void ParseString(String jsonString) 
    { 
     String[] splitByComma = jsonString.Split(','); 
     List<String[]> splitByColon = new List<String[]>(); 
     foreach (String s in splitByComma) 
     { 
      String[] split = s.Split(':'); 
      splitByColon.Add(split); 
     } 

     for (int i = 0; i < splitByColon.Count; i++) 
     { 
      for (int j = 0; j < splitByColon[i].Length; j++) 
      { 
       splitByColon[i][j] = splitByColon[i][j].Replace(",", ""); 
       splitByColon[i][j] = splitByColon[i][j].Replace("}", ""); 
       splitByColon[i][j] = splitByColon[i][j].Replace("{", ""); 
       splitByColon[i][j] = splitByColon[i][j].Replace("\"", ""); 
       splitByColon[i][j] = splitByColon[i][j].Replace("\\", ""); 
       splitByColon[i][j] = splitByColon[i][j].Replace(":", ""); 
      } 
     } 

     foreach (String[] array in splitByColon) 
     { 
      JsonProperty p = new JsonProperty(); 
      p.Name = array[0]; 
      p.Value = array[1]; 
      Properties.Add(p.Name, p); 
     } 
    } 

    public override String ToString() 
    { 
     StringBuilder sb = new StringBuilder(); 
     sb.Append("{"); 
     int count = 1; 
     foreach (KeyValuePair<String, JsonProperty> p in Properties) 
     { 
      sb.Append("\"" + p.Key.ToString() + "\""); 
      sb.Append(":" + p.Value.Value.ToString()); 
      if (count < Properties.Count) 
      { 
       sb.Append(","); 
      } 
      count++; 
     } 
     sb.Append("}"); 
     return sb.ToString(); 
    } 
} 

}

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

{"SSN":"300391-1453","LoanAmount":50000.0,"LoanDuration":"2015/02/02","CreditScore":550,"Receipients":[{"bankXML":"bankXML","bankJSON":"bankJSON","bankWeb":"bankWeb"]} 

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

Как бы я мог достичь этого?

+2

есть почему вы не используете Javascript Serializer для перемещения между объектами .NET и JSON? – Hopdizzle

+0

@Hopdizzle Я чувствовал, что конкретные объекты Json просто легче управлять если я хотел добавить/удалить свойства из строки. Я также не мог контролировать, что результат был из сериализатора, и это вызвало несколько проблем. – OmniOwl

+0

@Vipar Существующий сериализатор позволяет десериализовать объекты Json тоже –

ответ

0

Вы начинаете с json.org, в котором есть (помимо всего прочего) грамматика JSON . Затем вы записываете токенизатор , который считывает поток символов и испускает поток токенов (например, пробел, число, строка, двоеточие, запятая, квадратная скобка (влево/вправо), фигурные скобки (влево/вправо), и т.д. Тогда вы пишете анализатор распознавать нужную грамматику и конвертировать различные конструкции в нужное представление.

Или вы можете использовать любой из ряда предварительно написанных сериализации инструментов JSON.

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