如何在post方法中反序列化asp.net核心api中的json数组



如何解决这个问题(序列化/反序列化JSON数组以及从sql server存储和读取(?谢谢

我创建了连接到angular项目的asp.net核心api,当我想要包含json数组(成分(的post-json时会出现问题:

{ "RecepieName": "3222",
"Ingredient": [ { "ingredientName": "43243", "value": "33", "measure": "" },
{ "ingredientName": "565" , "value": "3", "measure": "" }],
"CookingTime": 3,
"Level": "advance", 
"ServingPerson": 3, 
"RecepieAbstration": "good food",
"RecepieText": "",
"CreateDate": "2021-01-04T12:37:51.948",
"ModifiedDate": "2021-01-04T12:37:51.948" }

当我使用邮递员进行测试时,我遇到了这个错误:

邮递员错误

你可以在控制器中看到我的型号、dto和动作帖子:

型号:

public class Recepie
{
[Key]
public int ID { get; set; }
[Required]
public string RecepieName { get; set; }
[Required]
public string Ingredient { get; set; }   // include ingredientName / value / measure array
[Required]
public int CookingTime { get; set; }
[Required]
public string Level { get; set; }
[Required]
public int ServingPerson { get; set; }
[Required]
public string RecepieAbstration { get; set; }
[Required]
public string RecepieText { get; set; }
[Required]
public string NutritionalInformation { get; set; }
[Required]
public string Tags { get; set; }

public DateTime CreateDate { get; set; }
public DateTime ModifiedDate { get; set; }
}

DTO:RecepieCreateD到

public class RecepieCreateDto
{
public string RecepieName { get; set; }
//public int MentorID { get; set; }
public string Ingredient { get; set; }

public int CookingTime { get; set; }
public string Level { get; set; }
public int ServingPerson { get; set; }
public string RecepieAbstration { get; set; }
public string RecepieText { get; set; }
public string Tags { get; set; }
public DateTime CreateDate { get; set; }
public DateTime ModifiedDate { get; set; }
}

行动帖子:

//Post api/recepie
[HttpPost]
public ActionResult <RecepieReadDto> CreateRecepie(RecepieCreateDto recepieCreateDto)
{
var recepieModel = _mapper.Map<Recepie>(recepieCreateDto);
_repository.CreateRecepieObject(recepieModel);
_repository.SaveChange();
var recepieReadDto = _mapper.Map<RecepieReadDto>(recepieModel);
return CreatedAtRoute(nameof(GetRecepieByID), new { Id = recepieReadDto.ID }, recepieReadDto);
// return Ok(recepieModel);
}
you can implement solution like below code ;
1 : Create View model For input Api;

public class RecepieCreateViewModel
{

public string RecepieName { get; set; }

public List<Ingredient> Ingredient { get; set; }

public int CookingTime { get; set; }

public string Level { get; set; }

public int ServingPerson { get; set; }

public string RecepieAbstration { get; set; }

public string RecepieText { get; set; }

public string NutritionalInformation { get; set; }

public string Tags { get; set; }

public DateTime CreateDate { get; set; }

public DateTime ModifiedDate { get; set; }
}

public class Ingredient
{
public string ingredientName { get; set; }
public string value { get; set; }
public string measure { get; set; }
}

2 : Create Dto Model
public class RecepieCreateDto
{
public string RecepieName { get; set; }
public string Ingredient { get; set; }
public int CookingTime { get; set; }
public string Level { get; set; }
public int ServingPerson { get; set; }
public string RecepieAbstration { get; set; }
public string RecepieText { get; set; }
public string NutritionalInformation { get; set; }
public string Tags { get; set; }
public DateTime CreateDate { get; set; }
public DateTime ModifiedDate { get; set; }
}
3 : Cast Ingredient Model ToJson Object In Api And Create New RecepieCreateDto Like Below Code
var result=Newtonsoft.Json.JsonConvert.SerializeObject(recepieCreateDto.Ingredient);

RecepieCreateDto readDto = new RecepieCreateDto
{
CookingTime = recepieCreateDto.CookingTime,
Level = recepieCreateDto.Level ,
ModifiedDate = recepieCreateDto.ModifiedDate ,
NutritionalInformation = recepieCreateDto.NutritionalInformation ,
RecepieAbstration = recepieCreateDto.RecepieAbstration ,
RecepieName = recepieCreateDto.RecepieName ,
RecepieText = recepieCreateDto.RecepieText ,
ServingPerson = recepieCreateDto.ServingPerson ,
CreateDate = recepieCreateDto.CreateDate ,
Tags = recepieCreateDto.Tags ,
Ingredient=result,
};
RecepieCreateDto类中的

Ingredient是一个字符串,但在您的请求中json Ingredient却是一个数组。因此,将RecepieCreateD更改为class或请求json。

"[{"ingredientName": "43243", "value": "33", "measure": "" },{ "ingredientName": "565" , "value": "3", "measure": "" }]"

public IList<Ingredient> Ingredient { get; set; }

您需要为Ingredient属性创建一个类。

public class Ingredient {
public string IngredientName { get; set; }
public string Value { get; set; } // This might be an int, you can change this on your purpose.
public string Measure { get; set; } // This might be an int, you can change this on your purpose.
}

看起来你发布的成分是一种收集类型,所以制作成分列表<gt;或者任何其他收集类型都可以做到这一点。

public class RecepieCreateDto
{
public string RecepieName { get; set; }
//public int MentorID { get; set; }
public List<Ingredient> Ingredient { get; set; }

public int CookingTime { get; set; }
public string Level { get; set; }
public int ServingPerson { get; set; }
public string RecepieAbstration { get; set; }
public string RecepieText { get; set; }
public string Tags { get; set; }
public DateTime CreateDate { get; set; }
public DateTime ModifiedDate { get; set; }
}

在这些更改之后,您可能需要对Recepie模型进行类似的更改。

您正在为Ingredient传递数组,但需要字符串。请将Ingredient更改为List<Ingredient>,其中Ingredient是您的新对象,具有名称、价值和含义。例如:

public class Ingredient
{
[Key]
int Id {get; set; }
string IngredientName { get; set; }
string Value { get; set; }
string Measure { get; set; }
}

更新:请分别更新DTO模型,并在RecepieCreateDto中使用

public class IngredientDTO
{
string IngredientName { get; set; }
string Value { get; set; }
string Measure { get; set; }
}

最新更新