بدست آوردن مقادیر یک داده جیسون
سلام
من از ویو یک داده جیسون به سمت اکشن متد ارسال میکنم بصورت زیر :
[HttpPost]
public IActionResult Index([FromBody]object jsondata)
{
jsondata شامل فیلدهای مختلفی هست مثلا بصورت زیر :
{{
"field1": [
"test1"
],
"field2": [
{"id":1,"Name":"test3"},
{"id":2,"Name":"test4"},
],
"field3": "<p>ff</p>\n"
}}
من چطور میتونم به داده های هر آیتم دسترسی داشته باشم ؟
از روش زیر استفاده کردم که بنظرم روش مناسبی نیست مخصوصا که نوع آبجکت رو به رشته تبدیل میشه و بعد هر آیتم رو بصورت ارایه برمیگردونه .
dynamic results = JsonConvert.DeserializeObject<object>(jsondata.ToS tring());
var fname= results.field1[0];
نقل قول: بدست آوردن مقادیر یک داده جیسون
دقیقا باید از همون متد استفاده کنین منتها برای ساده شدن دسترسی به مقادیر، شما باید یه کلاس مدل درست کنین و پراپرتی های مورد نیاز رو در اون کلاس تعریف کنین، بعدش متد DeserializeObject رو از نوع کلاستون میگیرید، مثال:
public class SomeModel
{
public string field1 { get; set; }
public List<Person> field2 { get; set; }
public string field3 { get; set; }
}
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
}
و به این شکل داده هارو میخونین:
var results = JsonConvert.DeserializeObject<SomeModel>(jsondata. ToString());
fname = results.field1;
tag = results.field3;
Id = results.field2[0].Id;
نقل قول: بدست آوردن مقادیر یک داده جیسون
ممنون . میشه کاری کرد که field2 از نوع لیست نباشه ؟ و در واقع همون کلاس رو بپذیره ؟
تو این حالت برای پاس دادن داده ها باید هر کدوم رو دوباره به یه کلاس پاس بدیم که درسته ؟ از mapper هم به دلیل متفاوت بودن نوعشون نمیتونیم استفاده کنیم .
Product model = new Product()
{
Title = results.field2[0].Title,
UserId=results.field2[0].UserId,
//DateProduct = DateTime.Now,
};
نقل قول: بدست آوردن مقادیر یک داده جیسون
اگه fiel2 چند مقداری باشه، یعنی آرایه ای از Id و Name ها باشه، خیر نمیشه از آبجکتی از کلاس استفاده کرد و حتما باید لیست باشه، دقیقا مثالی از داده هایی که خودتون گذاشتین:"field2": [{"id":1,"Name":"test3"},
{"id":2,"Name":"test4"},
],
الان این field2 آرایه ای هست پس باید حتما لیست باشه، اما اگه یقین دارین که جیسانی که بهتون برگشت داده میشه field2 تنها شامل یک Id و یک Name هست، در این حالت میتونین از آبجکتی از کلاس مثلا person استفاده کنین
برای پاس دادن اطلاعات هم شما میتونین از linq استفاده کنین، برای مثال:var productsList = results.field2.Select(s => new Product
{
Title = s.Title,
UserId = s.UserId,
ProductDate = DateTime.Now
});
برای mapper چون بنده با mapper ها کار نکردم دقیق نمیدونم، اما احتمال میدم باید بصورت دستی براش تعریف کنین که چه فیلدی رو به کدوم نسبت بده
نقل قول: بدست آوردن مقادیر یک داده جیسون
برای پاس دادن اطلاعات هم شما میتونین از linq استفاده کنین، برای مثال:
var productsList = results.field2.Select(s => new Product
{
Title = s.Title,
UserId = s.UserId,
ProductDate = DateTime.Now
});
[/QUOTE]
بسیار ممنون
در این حالت آیا فرقی هم میکنه که من از product بصورت مستقیم new کنم ؟ یا اینکه باید ابتدا یک ویو مدل بسازم و داده ها رو به ویومدل پاس بدم ؟
نقل قول: بدست آوردن مقادیر یک داده جیسون
شما هم میتونین یه ویومدل بسازین و هم اینکه از anonymous تایپ ها استفاده کنین...
استفاده از ویومدل که مشخصه، اما برای استفاده از anonymous تایپ ها توی قسمت new کردن نباید اسم هیچ کلاسی رو ذکر کنین، به این شکل:
var productsList = results.field2.Select(s => new
{
Title = s.Title,
UserId = s.UserId,
ProductDate = DateTime.Now
});