[英]How to get the key value json format in an array?
我想從我的 sp 中返回一種特定類型的 JSON 格式。 下面是我想要的 JSON 格式:
我正在使用數據集從 Query 中獲取。 我已經從表中循環了數據行。 我使用 KeyValuPair 類型來獲取數據。 但無法獲得所需的格式,我只獲得格式鍵值,但如何在元數據中獲得它。
我想要的 JSON output
{
"Metadata": [
{
"Key": "FirstName",
"Value": "ABC"
},
{
"Key": "LastName",
"Value": "XYZ"
}
],
"Length": 25,
"Type": "application/mp3"
}
C# 代碼從 sp 獲取數據
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
List<Class> objList = new List<Class>();
List<KeyValuePair<string, string>> keyvalList = new List<KeyValuePair<string, string>>();
foreach (DataRow t in ds.Tables[0].Rows)
{
Class obj1 = new Class();
obj1.FirstName = Convert.ToString(t["FirstName "]);
obj1.LastName= Convert.ToString(t["LastName"]);
objList.Add(obj1);
keyvalList.Add(new KeyValuePair<string, string>("FirstName ", Convert.ToString(t["FirstName"])));
keyvalList.Add(new KeyValuePair<string, string>("LastName", Convert.ToString(t["LastName"]);
}
string JSONresult = JsonConvert.SerializeObject(keyvalList);
return JSONresult;
我的 Class 結構
public class Class
{
public string FirstName{ get; set; }
public string LastName{ get; set; }
}
我得到的 JSON 格式
[{\"key":\"FirstName\", \"Value\":\"ABC\"},{\"key":\"LastName\", \"Value\":\"XYZ\"}]
我得到鍵值 JSON 但它沒有進入元數據數組。
更新
var data = new
{
Metadata = dt.AsEnumerable()
.Select(m => new Header
{
key= m.Field<string>("AgentId"),
Value= m.Field<string>("LastName"),
FirstName = m["FirstName"].ToString(),
LastName = m["LastName"].ToString()
}).ToList(),
Length = "25",
Type = "application/mp3"
};
string JSONreult = JsonConvert.SerializeObject(data);
return JSONreult;
Output 我得到了什么
{
"Metadata": [
[
{
"Key": "FirstName",
"Value": "ABC"
},
{
"Key": "LastName",
"Value": "DEF"
}
],
[
{
"Key": "FirstName",
"Value": "GEH"
},
{
"Key": "LastName",
"Value": "IJK"
}
]
],
"Length": 25,
"Type": "application/json"
}
Output 我想要多少
{
"Metadata": [
{
"Key": "FirstName",
"Value": "ABC"
},
{
"Key": "LastName",
"Value": "XYZ"
}
],
"Length": 25,
"Type": "audio/mp3",
}
區別
MetaData 中的額外 [] 而我只需要一個數組。
您必須創建一個 class
public class Data {
public IList<KeyPairValue<string,string>> Metadata{ get; set; }
}
用您的值填充它,然后將其序列化為 Json。
答案根據評論更新
您的問題由兩部分組成:
1.如何填充DataTable
2.如何將其序列化為 json(自定義外觀)
首先,更改您的 class 結構,如下所示:
public class Metadata
{
public string FirstName { get; set; }
public string LasstName { get; set; }
}
public class Data
{
public IList<Metadata> Metadata { get; set; }
public int Length { get; set; }
public string Type { get; set; }
}
然后你應該使用 Linq 用數據庫查詢結果填充dt
:
DataTable dt = new DataTable();
da.Fill(dt);
var listOfData = new Data
{
Metadata = dt.AsEnumerable()
.Select(m => new FullName
{
Key = m["FirstName"].ToString(),
Value = m["LastName"].ToString()
}).ToList(),
Length = 25,
Type = "application/mp3"
};
使用var json = JsonConvert.SerializeObject(listOfData);
將listOfData
序列化為 json 后; 命令,output 將是這樣的:
{
"Metadata":[
{
"Key":"John",
"Value":"Smith"
},
{
"Key":"Adele",
"Value":"Jones"
}
],
"Length":25,
"Type":"application/mp3"
}
但它與您想要的 output 不同:
{
"Metadata":[
{
"Key":"FirstName",
"Value":"John"
},
{
"Key":"LastName",
"Value":"Smith"
}
],
"Length":25,
"Type":"application/mp3"
}
如果您想更改 json 的外觀並以自定義方式對其進行序列化,則必須實現Custon JsonConverter ,因為 JsonSerializer 無法自行更改 model。 為此,您必須創建一個 class 並從JsonConverter
派生它並覆蓋其方法以根據需要塑造您的節點:
class CustomMetadataConverter<T> : JsonConverter where T : class
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(T);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject obj = new JObject(
JArray.Load(reader)
.Children<JObject>()
.Select(jo => new JProperty((string)jo["Key"], jo["Value"]))
);
T result = Activator.CreateInstance<T>();
serializer.Populate(obj.CreateReader(), result);
return result;
}
public override bool CanRead
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
JArray array = new JArray(
JObject.FromObject(value)
.Properties()
.Select(jp =>
new JObject(
new JProperty("Key", jp.Name),
new JProperty("Value", jp.Value)
)
)
);
array.WriteTo(writer);
}
}
然后以這種方式調用JsonObject.SerializeObject
而不是像往常一樣調用它:
var json = JsonConvert.SerializeObject(listOfData, Formatting.Indented /* set it depend on your need */, new CustomMetadataConverter<Metadata>());
你可以用同樣的方式反序列化它:
var deserializedObject = JsonConvert.DeserializeObject<JObject>(json, new CustomMetadataConverter<Metadata>());
這是 output:
{
"Metadata": [
[
{
"Key": "FirstName",
"Value": "John"
},
{
"Key": "LastName",
"Value": "Smith"
}
],
[
{
"Key": "FirstName",
"Value": "Adele"
},
{
"Key": "LastName",
"Value": "Jones"
}
]
],
"Length": 25,
"Type": "application/json"
}
你不需要像那樣做很多啤酒花。 您可以說使用 LinqToSQL 或 LinqToEF,以及來自 NuGet 的 Newtonsoft 的 Json.Net,您的代碼就像:
var data = new
{
MetaData = db.TableName
.Select(row => new { Key = row.FieldForKey, Value = row.FieldForValue }),
Length = 25,
Type = "application/mp3"
};
var json = Newtonsoft.Json.JsonConvert.SerializeObject(data);
如果您仍想改用 ADO.Net,您仍然可以這樣做:
var tbl = new DataTable();
new SqlDataAdapter(cmd, "your connection string here").Fill(tbl);
var data = new
{
MetaData = tbl.AsEnumerable()
.Select(t => new { Key = t.Field<string>("KeyColumn"), Value = t.Field<string>("ValueColumn")}),
Length = 25,
Type = "application/mp3"
};
var json = Newtonsoft.Json.JsonConvert.SerializeObject(data);
編輯:雖然我覺得很奇怪,但這里是使用 Northwind 示例數據庫的完整示例:
var tbl = new DataTable();
new SqlDataAdapter(@"Select t.*
from Customers c1
cross apply (select 'FirstName', customerId from customers c2 where c1.CustomerId = c2.CustomerId
union
select 'LastName', CompanyName from customers c2 where c1.CustomerId = c2.CustomerId) t([Key], [Value])
",@"server=.\SQLExpress2012;Database=Northwind;Trusted_Connection=yes").Fill(tbl);
var data = new
{
MetaData = tbl.AsEnumerable()
.Select(t => new {
Key = t.Field<string>("Key"),
Value = t.Field<string>("Value") } ),
Length = 25,
Type = "application/mp3"
};
var json = Newtonsoft.Json.JsonConvert.SerializeObject(data);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.