2015-09-16 3 views
0

У меня есть два DataTable, RCPT_HEADER и RCPT_DETAIL и попытка сериализации в иерархии объектов json с использованием Json.NET/C#. Я уже пробовал кодСериализованная деталь заголовка в иерархии объектов JSON

static JArray DataToArray(string connString, string query) 
     { 
      JArray jArray = new JArray(); 
      try 
      { 
       using (SqlConnection conn = new SqlConnection(connString)) 
       { 
        conn.Open(); 
        using (SqlCommand cmd = new SqlCommand(query, conn)) 
        { 
         SqlDataReader reader = cmd.ExecuteReader(); 
         while (reader.Read()) 
         { 
          int fieldcount = reader.FieldCount; 
          object[] values = new object[fieldcount]; 
          reader.GetValues(values); 
          JObject jo = new JObject(); 

          for (int index = 0; index < fieldcount; index++) 
          { 
           jo.Add(reader.GetName(index).ToString(), values[index].ToString()); 
          } 
          jArray.Add(jo); 
         } 
         reader.Close(); 
        } 
       } 
      } 
      catch (SqlException e) 
      { 
       WriteLog("[DataToArray]: " + e.Message); 
      } 
      return jArray; 
     } 

и

static void Main(string[] args) 
      { 
       try 
       { 
        Hashtable config = getSettings(AppPath() + "mware.config"); 
        string connString = config["cs"].ToString(); 
        StringBuilder sb = new StringBuilder(); 
        StringWriter sw = new StringWriter(sb); 
        JsonWriter jsonWriter = new JsonTextWriter(sw); 
        jsonWriter.Formatting = Newtonsoft.Json.Formatting.Indented; 
        JObject jObject = new JObject(); 
        JArray jArray = new JArray(); 

        jObject.Add("RCPT_HEADER", DataToArray(connString, "SELECT * FROM RCPT_HEADER")); 
        jObject.Add("RCPT_DETAIL", DataToArray(connString, "SELECT * FROM RCPT_DETAIL")); 
        jObject.WriteTo(jsonWriter); 
        Console.WriteLine(jObject.ToString()); 
        Console.ReadLine(); 
       } 
       catch (Exception e) 
       { 
        WriteLog("[postJSON]: " + e.Message); 
       } 
      } 

но я получаю такой вывод:

{ 
    "RCPT_HEADER": [ 
     { 
      "RECORD_ID": "1", 
      "ACTION_CODE": "SAVE", 
      "CONDITION": "Ready", 
      "DATE_TIME_STAMP": "9/11/2015 12:00:00 AM" 
     } 
    ], 
    "RCPT_DETAIL": [ 
     { 
      "RECORD_ID": "1", 
      "ACTION_CODE": "SAVE", 
      "CONDITION": "Ready", 
      "LINK_ID": "1", 
      "ITEM": "SKU00048700007683", 
      "DATE_TIME_STAMP": "9/11/2015 12:00:00 AM" 
     }, 
     { 
      "RECORD_ID": "2", 
      "ACTION_CODE": "SAVE", 
      "CONDITION": "Ready", 
      "LINK_ID": "1", 
      "ITEM": "SKU00048700007684", 
      "DATE_TIME_STAMP": "9/11/2015 12:00:00 AM" 
     } 
    ] 
} 

На самом деле, я хотел бы, чтобы вернуть результат, как это :

{ 
    "RCPT_HEADER": [ 
     { 
      "RECORD_ID": "1", 
      "ACTION_CODE": "SAVE", 
      "CONDITION": "Ready", 
      "DATE_TIME_STAMP": "9/11/2015 12:00:00 AM", 
      "RCPT_DETAIL": [ 
       { 
        "RECORD_ID": "1", 
        "ACTION_CODE": "SAVE", 
        "CONDITION": "Ready", 
        "LINK_ID": "1", 
        "ITEM": "SKU00048700007683", 
        "DATE_TIME_STAMP": "9/11/2015 12:00:00 AM" 
       }, 
       { 
        "RECORD_ID": "2", 
        "ACTION_CODE": "SAVE", 
        "CONDITION": "Ready", 
        "LINK_ID": "1", 
        "ITEM": "SKU00048700007684", 
        "DATE_TIME_STAMP": "9/11/2015 12:00:00 AM" 
       } 
      ] 
     } 
    ] 
} 

Любая помощь будет принята с благодарностью, так как это первый раз, когда я пытался использовать JSON.NET.

+0

Пожалуйста, покажите свой код, где вы на самом деле сериализации DataTables. –

ответ

0

Поскольку вы используете таблицы данных, он будет сериализовать таблицы таким образом как массив таблиц JSON.
Вы можете написать собственный JsonConverter, чтобы сериализовать его по-своему. Вот a good article.

Однако, на мой взгляд, есть еще одно хорошее, но хакерское решение: если у вас всегда есть одна и та же структура, и она не требует слишком большой производительности, будет легче десериализовать ее снова, переместить этот объект и сериализовать его обратно ,
Что-то вроде этого:

string json = "YOUR_JSON_RESULT"; 

JObject jsonObject = JObject.Parse(json); 

((JObject)jsonObject["RCPT_HEADER"][0]) 
     .Properties() 
     .Last() 
     .AddAfterSelf(new JProperty("RCPT_DETAIL", jsonObject["RCPT_DETAIL"])); 
jsonObject.Remove("RCPT_DETAIL"); 

string jsonResult = jsonObject.ToString(); 

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

public class RcptDetail 
{ 
    public string RECORD_ID { get; set; } 
    /* ... */ 
} 

public class RcptHeader 
{ 
    public string RECORD_ID { get; set; } 
    /* ... */ 
    public RcptDetail RCPT_DETAIL { get; set; } 
} 
+0

Елдар Курмангалиев. Теперь он работает отлично. ТЫ ЖЖЕШЬ...!! благодаря – frenzybluez

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