|
1 | 1 | using System.Reflection; |
2 | 2 | using System.Text; |
| 3 | +using System.Text.Json; |
| 4 | +using System.Text.Json.Nodes; |
3 | 5 |
|
4 | 6 | namespace CosmoSQLClient.Core; |
5 | 7 |
|
@@ -86,6 +88,43 @@ private static void SetProperty(object obj, PropertyInfo prop, SqlValue value) |
86 | 88 | if (v is not null) prop.SetValue(obj, v); |
87 | 89 | } |
88 | 90 |
|
| 91 | + /// <summary>Render as a JSON array of objects, one per row.</summary> |
| 92 | + public string ToJson(bool indented = true) |
| 93 | + { |
| 94 | + var array = new JsonArray(); |
| 95 | + foreach (var row in Rows) |
| 96 | + { |
| 97 | + var obj = new JsonObject(); |
| 98 | + for (int i = 0; i < Columns.Count; i++) |
| 99 | + obj[Columns[i].Name] = ToJsonNode(row[i]); |
| 100 | + array.Add(obj); |
| 101 | + } |
| 102 | + var options = new JsonSerializerOptions |
| 103 | + { |
| 104 | + WriteIndented = indented, |
| 105 | + Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping |
| 106 | + }; |
| 107 | + return array.ToJsonString(options); |
| 108 | + } |
| 109 | + |
| 110 | + private static JsonNode? ToJsonNode(SqlValue v) => v switch |
| 111 | + { |
| 112 | + SqlValue.Null => null, |
| 113 | + SqlValue.Bool b => JsonValue.Create(b.Value), |
| 114 | + SqlValue.Int8 b => JsonValue.Create(b.Value), |
| 115 | + SqlValue.Int16 s => JsonValue.Create(s.Value), |
| 116 | + SqlValue.Int32 i => JsonValue.Create(i.Value), |
| 117 | + SqlValue.Int64 l => JsonValue.Create(l.Value), |
| 118 | + SqlValue.Float f => JsonValue.Create(f.Value), |
| 119 | + SqlValue.Double d => JsonValue.Create(d.Value), |
| 120 | + SqlValue.Decimal d => JsonValue.Create(d.Value), |
| 121 | + SqlValue.Text t => JsonValue.Create(t.Value), |
| 122 | + SqlValue.Uuid u => JsonValue.Create(u.Value.ToString()), |
| 123 | + SqlValue.Date dt => JsonValue.Create(dt.Value.ToString("O")), |
| 124 | + SqlValue.Bytes b => JsonValue.Create(Convert.ToBase64String(b.Value)), |
| 125 | + _ => null |
| 126 | + }; |
| 127 | + |
89 | 128 | /// <summary>Render as a Markdown table string.</summary> |
90 | 129 | public string ToMarkdownTable() |
91 | 130 | { |
|
0 commit comments