使用curl调用REST API上传JSON文件时遇解析错误求解决
问题:上传JSON文件到REST API时出现500验证错误
执行的curl请求
curl -k -v -X POST 'https://myserver.ru/services/localizationservice/api/Dictionaries/UploadJson' -H 'accept: text/plain' -H 'Content-Type: text/json' -d "{'data': @test.json, 'fileType': json, 'isDelete': false}"
收到的500错误响应
{"message":"Validation error: data=Unexpected character encountered while parsing value: @. Path 'data', line 1, position 9./Unexpected character encountered while parsing value: @. Path 'data', line 1, position 9.","exceptionType":"ASE.MD.Platform.Utils.ServiceBase.Exceptions.CustomValidationException, ASE.MD.Platform.Utils.ServiceBase, Version=12.0.21.0, Culture=neutral, PublicKeyToken=null","code":"500","source":"dotnet","inners":[],"extra":" at ASE.MD.Platform.Utils.ServiceBase.ValidationExt.<>c.<AddCustomValidation>b__0_1(ActionContext c)\n at Microsoft.AspNetCore.Mvc.Infrastructure.ModelStateInvalidFilter.OnActionExecuting(ActionExecutingContext context)\n at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)\n at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsync()\n--- End of stack trace from previous location ---\n at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)\n at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)\n at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()\n--- End of stack trace from previous location ---\n at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextExceptionFilterAsync>g__Awaited|26_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)","isError":true,"id":"","type":"Error"}
test.json文件内容
{ "DictionaryCode": "test", "Translations": [ { "Key": "Connection", "Words": [ { "CultureCode": "en-US", "Word": "Connection" }, { "CultureCode": "ru-RU", "Word": "Связь" } ] }, { "Key": "first+second", "Words": [ { "CultureCode": "ru-RU", "Word": "" }, { "CultureCode": "en-US", "Word": "" } ] }, { "Key": "VersionDiff_DisableReason_KeyAttributesNotSet", "Words": [ { "CultureCode": "en-US", "Word": "There's nothing you don't need" }, { "CultureCode": "ru-RU", "Word": "Нет чего не надо" } ] } ] }
修复方案
错误原因
原命令中,-d参数的JSON字符串里的@test.json不会被curl解析为文件内容,而是作为纯字符串@test.json发送给后端。后端解析JSON时,@属于非法起始字符,因此抛出验证错误。
正确的请求方式
方法1:使用jq构造合法JSON(推荐)
利用jq工具读取文件内容并生成符合要求的JSON请求体,同时将Content-Type改为标准的application/json:
curl -k -v -X POST 'https://myserver.ru/services/localizationservice/api/Dictionaries/UploadJson' \ -H 'accept: text/plain' \ -H 'Content-Type: application/json' \ -d "$(jq -n --arg data "$(cat test.json)" '{data: $data, fileType: "json", isDelete: false}')"
方法2:手动转义文件内容并构造JSON
如果没有jq,可以用cat和sed转义文件中的双引号,再构造JSON:
curl -k -v -X POST 'https://myserver.ru/services/localizationservice/api/Dictionaries/UploadJson' \ -H 'accept: text/plain' \ -H 'Content-Type: application/json' \ -d "{\"data\": \"$(cat test.json | sed 's/"/\\"/g')\", \"fileType\": \"json\", \"isDelete\": false}"
注意事项
- 确保
test.json文件路径正确,若不在当前目录需使用绝对路径。 Content-Type头使用标准的application/json而非text/json,避免部分服务解析异常。
内容的提问来源于stack exchange,提问作者Владимир Казанцев
相关产品推荐
相关产品推荐

