View Full Version : بدست آوردن مقادیر یک داده جیسون
sara_t
دوشنبه 12 شهریور 1397, 11:34 صبح
سلام
من از ویو یک داده جیسون به سمت اکشن متد ارسال میکنم بصورت زیر :
[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.ToString());
var fname= results.field1[0];
mr.sirwan
دوشنبه 12 شهریور 1397, 20:04 عصر
دقیقا باید از همون متد استفاده کنین منتها برای ساده شدن دسترسی به مقادیر، شما باید یه کلاس مدل درست کنین و پراپرتی های مورد نیاز رو در اون کلاس تعریف کنین، بعدش متد 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;
sara_t
چهارشنبه 14 شهریور 1397, 10:10 صبح
ممنون . میشه کاری کرد که field2 از نوع لیست نباشه ؟ و در واقع همون کلاس رو بپذیره ؟
تو این حالت برای پاس دادن داده ها باید هر کدوم رو دوباره به یه کلاس پاس بدیم که درسته ؟ از mapper هم به دلیل متفاوت بودن نوعشون نمیتونیم استفاده کنیم .
Product model = new Product()
{
Title = results.field2[0].Title,
UserId=results.field2[0].UserId,
//DateProduct = DateTime.Now,
};
mr.sirwan
چهارشنبه 14 شهریور 1397, 13:47 عصر
اگه 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 ها کار نکردم دقیق نمیدونم، اما احتمال میدم باید بصورت دستی براش تعریف کنین که چه فیلدی رو به کدوم نسبت بده
sara_t
چهارشنبه 14 شهریور 1397, 22:54 عصر
برای پاس دادن اطلاعات هم شما میتونین از linq استفاده کنین، برای مثال:
var productsList = results.field2.Select(s => new Product
{
Title = s.Title,
UserId = s.UserId,
ProductDate = DateTime.Now
});
[/QUOTE]
بسیار ممنون
در این حالت آیا فرقی هم میکنه که من از product بصورت مستقیم new کنم ؟ یا اینکه باید ابتدا یک ویو مدل بسازم و داده ها رو به ویومدل پاس بدم ؟
mr.sirwan
پنج شنبه 15 شهریور 1397, 13:08 عصر
شما هم میتونین یه ویومدل بسازین و هم اینکه از anonymous تایپ ها استفاده کنین...
استفاده از ویومدل که مشخصه، اما برای استفاده از anonymous تایپ ها توی قسمت new کردن نباید اسم هیچ کلاسی رو ذکر کنین، به این شکل:
var productsList = results.field2.Select(s => new
{
Title = s.Title,
UserId = s.UserId,
ProductDate = DateTime.Now
});
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.