猿问

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

我已经在使用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?


慕丝7291255
浏览 185回答 3
3回答

侃侃尔雅

由于您无法更改 Json 的格式,我想说以下类应该按预期工作:public class UpdateResultSt{&nbsp; &nbsp; public bool isSuccess { get; set; }&nbsp; &nbsp; public int elapsed { get; set; }&nbsp; &nbsp; public Dictionary<string,string> results { get; set; }&nbsp; &nbsp; public Dictionary<string,string> errors { get; set; }}然后你可以这样写:routes_list.results["131351990802396920"]获取文本"updated"。或者routes_list.results.Keys得到的名单id中的S results。请参阅反序列化字典。

鸿蒙传说

SuccessfulUpdateResult 和 FailedUpdateResult 的格式不正确。应该是这样的:{&nbsp; &nbsp; "isSuccess": true,&nbsp; &nbsp; "elapsed": 54,&nbsp; &nbsp; "results": [&nbsp; &nbsp; &nbsp; &nbsp; 0: { "id" : "131351990802396920", "text" : "updated"},&nbsp; &nbsp; &nbsp; &nbsp; 1: { "id" :"21034623651844830", "text" : "updated"},&nbsp; &nbsp; &nbsp; &nbsp; 2: { "id" :"112201011402879160", "text" : "updated"}&nbsp; &nbsp; ],&nbsp; &nbsp; "errors": {&nbsp; &nbsp; &nbsp;// same than SuccessfulUpdateResult&nbsp;&nbsp; &nbsp; &nbsp;...&nbsp; &nbsp; }}

湖上湖

您的 json 字符串不代表您尝试将其反序列化的对象图。你的外部类应该有一个数组或结果和一个数组或类似于这样的错误:{"isSuccess": true,"elapsed": 54,"results": [&nbsp; &nbsp; {"id":"131351990802396920", "test":"updated"},&nbsp; &nbsp; {"id":"21034623651844830","text":"updated"},&nbsp; &nbsp; {"id":"112201011402879160", "text":"updated"}],"errors": [{"id":"105933291602523100","test":"Error"},{"id":"106574790922078090","text":"Error"},{"id":"114439941021395940","text":"Error"},{"id":"123574814601457710","text":"Error"}]}您拥有的是一个结果类,其中包含三个名为 131351990802396920、21034623651844830、112201011402879160 的字段,因此它无法将其映射到您的对象。
随时随地看视频慕课网APP
我要回答