为了账号安全,请及时绑定邮箱和手机立即绑定

如何将包含可变内容的字符串转换为 JSON

如何将包含可变内容的字符串转换为 JSON

C#
慕丝7291255 2021-11-28 16:08:57
我已经在使用Newtonesoft Package的JsonSerializer将字符串转换为 JSON 格式,但它无法将此字符串转换为 JSON。{    "isSuccess": true,    "elapsed": 54,    "results": {        "131351990802396920": "updated",        "21034623651844830": "updated",        "112201011402879160": "updated"    },    "errors": {    "105933291602523100": "Error",    "106574790922078090": "Error",    "114439941021395940": "Error",    "123574814601457710": "Error"    }}我试图将字符串转换为的类结构如下:public class UpdateResultSt{    public bool isSuccess { get; set; }    public int elapsed { get; set; }    public List<SuccessfulUpdateResult> results = new List<SuccessfulUpdateResult>();    public List<FailedUpdateResult> errors = new List<FailedUpdateResult>();}public class SuccessfulUpdateResult{    public string id { get; set; }    public string text { get; set; }}public class FailedUpdateResult{    public string id { get; set; }    public string text { get; set; }}这是我的一些负责转换的代码:    JsonSerializer json_serializer;    json_serializer = new JsonSerializer    {            NullValueHandling = NullValueHandling.Ignore    };    JsonReader jsonReader = new JsonTextReader(new StringReader(responseFromServer));    UpdateResultSt routes_list = json_serializer.Deserialize<UpdateResultSt>(jsonReader);如您所见,the Results和the Errors范围都有可变内容。还有一些其他问题也有同样的问题,但没有人能解决我的问题。错误信息是:'无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型 'System.Collections.Generic.List`1[ConceptTaggerWinApp.UpdateResultSt]' 因为该类型需要一个 JSON 数组(例如 [1,2 ,3]) 以正确反序列化。要修复此错误,请将 JSON 更改为 JSON 数组(例如 [1,2,3])或更改反序列化类型,使其成为正常的 .NET 类型(例如,不是像整数这样的原始类型,而不是像这样的集合类型)可以从 JSON 对象反序列化的数组或列表)。还可以将 JsonObjectAttribute 添加到类型以强制它从 JSON 对象反序列化。路径“isSuccess”,第 1 行,位置 13。如何更改我的类结构以成功将此字符串转换为 JSON?
查看完整描述

3 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

由于您无法更改 Json 的格式,我想说以下类应该按预期工作:


public class UpdateResultSt

{

    public bool isSuccess { get; set; }

    public int elapsed { get; set; }


    public Dictionary<string,string> results { get; set; }

    public Dictionary<string,string> errors { get; set; }

}

然后你可以这样写:


routes_list.results["131351990802396920"]

获取文本"updated"。


或者routes_list.results.Keys得到的名单id中的S results。


请参阅反序列化字典。


查看完整回答
反对 回复 2021-11-28
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

SuccessfulUpdateResult 和 FailedUpdateResult 的格式不正确。


应该是这样的:


{

    "isSuccess": true,

    "elapsed": 54,

    "results": [

        0: { "id" : "131351990802396920", "text" : "updated"},

        1: { "id" :"21034623651844830", "text" : "updated"},

        2: { "id" :"112201011402879160", "text" : "updated"}

    ],

    "errors": {

     // same than SuccessfulUpdateResult 

     ...

    }

}


查看完整回答
反对 回复 2021-11-28
?
湖上湖

TA贡献2003条经验 获得超2个赞

您的 json 字符串不代表您尝试将其反序列化的对象图。你的外部类应该有一个数组或结果和一个数组或类似于这样的错误:


{

"isSuccess": true,

"elapsed": 54,

"results": [

    {"id":"131351990802396920", "test":"updated"},

    {"id":"21034623651844830","text":"updated"},

    {"id":"112201011402879160", "text":"updated"}

],

"errors": [

{"id":"105933291602523100","test":"Error"},

{"id":"106574790922078090","text":"Error"},

{"id":"114439941021395940","text":"Error"},

{"id":"123574814601457710","text":"Error"}

]

}


您拥有的是一个结果类,其中包含三个名为 131351990802396920、21034623651844830、112201011402879160 的字段,因此它无法将其映射到您的对象。


查看完整回答
反对 回复 2021-11-28
  • 3 回答
  • 0 关注
  • 184 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信