【问题标题】:Serialized Header Detail into JSON Object Hierarchy将标头详细信息序列化为 JSON 对象层次结构
【发布时间】:2015-11-02 21:59:10
【问题描述】:

我有两个 DataTable,RCPT_HEADER 和 RCPT_DETAIL 并尝试使用 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。

【问题讨论】:

  • 请在您实际序列化数据表的位置显示您的代码。

标签: c# json json.net


【解决方案1】:

当您使用数据表时,它会以这种方式将表序列化为 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; }
}

【讨论】:

  • 叶尔达尔·库曼加利耶夫。它现在运行良好。你摇滚……!!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 2010-10-13
  • 2021-12-12
  • 1970-01-01
相关资源
最近更新 更多