【问题标题】:Retrieving data from Json returns null从 Json 中检索数据返回 null
【发布时间】:2017-09-03 19:07:09
【问题描述】:

我有以下 json,当通过 JSONLink 运行时,它会作为有效的 json 返回,并且我使用 json2csharp 创建了我的类。但我似乎无法获得所需的数据,我已阅读

How to retrieve data from json data

How to read data from json on C#

http://www.c-sharpcorner.com/article/working-with-json-string-in-C-Sharp/

http://www.c-sharpcorner.com/article/json-serialization-and-deserialization-in-c-sharp/

关于最后一个链接,一个数组:

数组以“[”开头,以“]”结尾。并且值是分开的 用逗号。例如,

所以,我已经阅读了所有内容,并且我的 JSON 在下面,并且我已按照以下步骤操作。

  1. 验证 json
  2. 创建的类
  3. 转换成字符串
  4. 反序列化对象

为什么会出现空引用异常

代码:

[{
    "value": {
        "dtgeContentTypeAlias": "carousel",
        "value": {
            "name": "Layout",
            "carouselItem": [{
                "name": "Item 1",
                "ncContentTypeAlias": "carouselItem",
                "textToDisplay": "text  to display",
                "image": "umb://media/caa97c18a35f4fbbae2efa20f20c81ae",
                "navigationLinks": [{
                    "id": "1063",
                    "name": "Home",
                    "udi": "umb://document/4dfc35a72aea4be5b3496d1c02a09072",
                    "url": "/",
                    "icon": "icon-document",
                    "published": true
                }]
            }]
        },
        "id": "59dc484a-1078-2447-34a3-c7ed5256cd48"
    },
    "editor": {
        "name": "Layout",
        "alias": "docType",
        "view": "/App_Plugins/DocTypeGridEditor/Views/doctypegrideditor.html",
        "render": "/App_Plugins/DocTypeGridEditor/Render/DocTypeGridEditor.cshtml",
        "icon": "icon-item-arrangement",
        "config": {
            "allowedDocTypes": [],
            "nameTemplate": "",
            "enablePreview": true,
            "viewPath": "/Views/Partials/Grid/Editors/DocTypeGridEditor/",
            "previewViewPath": "/Views/Partials/Grid/Editors/DocTypeGridEditor/Previews/",
            "previewCssFilePath": "",
            "previewJsFilePath": ""
        }
    },
    "active": false
}]


var jsonDoc = control.JObject.ToString();
                var myDetails = JsonConvert.DeserializeObject<CarouselItem>(jsonDoc);
                var test2 = JObject.Parse(jsonDoc).First.ToString();
                string test = myDetails.textToDisplay.ToString();

我在这里错过了什么!

-------------由 Json2CSharp 生成的所有类请求----------

public class NavigationLink
{
    public string id { get; set; }
    public string name { get; set; }
    public string udi { get; set; }
    public string url { get; set; }
    public string icon { get; set; }
    public bool published { get; set; }
}

public class CarouselItem
{
    public string name { get; set; }
    public string ncContentTypeAlias { get; set; }
    public string textToDisplay { get; set; }
    public string image { get; set; }
    public List<NavigationLink> navigationLinks { get; set; }
}

public class Value2
{
    public string name { get; set; }
    public List<CarouselItem> carouselItem { get; set; }
}

public class Value
{
    public string dtgeContentTypeAlias { get; set; }
    public Value2 value { get; set; }
    public string id { get; set; }
}

public class Config
{
    public List<object> allowedDocTypes { get; set; }
    public string nameTemplate { get; set; }
    public bool enablePreview { get; set; }
    public string viewPath { get; set; }
    public string previewViewPath { get; set; }
    public string previewCssFilePath { get; set; }
    public string previewJsFilePath { get; set; }
}

public class Editor
{
    public string name { get; set; }
    public string alias { get; set; }
    public string view { get; set; }
    public string render { get; set; }
    public string icon { get; set; }
    public Config config { get; set; }
}

public class RootObject
{
    public Value value { get; set; }
    public Editor editor { get; set; }
    public bool active { get; set; }
} 

-------------转换为字符串时的完整对象--------

jsonDoc "{\r\n  \"value\": {\r\n    \"dtgeContentTypeAlias\": \"carousel\",\r\n    \"value\": {\r\n      \"name\": \"Layout\",\r\n      \"carouselItem\": [\r\n        {\r\n          \"name\": \"Item 1\",\r\n          \"ncContentTypeAlias\": \"carouselItem\",\r\n          \"textToDisplay\": \"text  to display\",\r\n          \"image\": \"umb://media/caa97c18a35f4fbbae2efa20f20c81ae\",\r\n          \"navigationLinks\": [\r\n            {\r\n              \"id\": \"1063\",\r\n              \"name\": \"Home\",\r\n              \"udi\": \"umb://document/4dfc35a72aea4be5b3496d1c02a09072\",\r\n              \"url\": \"/\",\r\n              \"icon\": \"icon-document\",\r\n              \"published\": true\r\n            }\r\n          ]\r\n        }\r\n      ]\r\n    },\r\n    \"id\": \"59dc484a-1078-2447-34a3-c7ed5256cd48\"\r\n  },\r\n  \"editor\": {\r\n    \"name\": \"Layout\",\r\n    \"alias\": \"docType\",\r\n    \"view\": \"/App_Plugins/DocTypeGridEditor/Views/doctypegrideditor.html\",\r\n    \"render\": \"/App_Plugins/DocTypeGridEditor/Render/DocTypeGridEditor.cshtml\",\r\n    \"icon\": \"icon-item-arrangement\",\r\n    \"config\": {\r\n      \"allowedDocTypes\": [],\r\n      \"nameTemplate\": \"\",\r\n      \"enablePreview\": true,\r\n      \"viewPath\": \"/Views/Partials/Grid/Editors/DocTypeGridEditor/\",\r\n      \"previewViewPath\": \"/Views/Partials/Grid/Editors/DocTypeGridEditor/Previews/\",\r\n      \"previewCssFilePath\": \"\",\r\n      \"previewJsFilePath\": \"\"\r\n    }\r\n  },\r\n  \"active\": false\r\n}"    string

【问题讨论】:

  • 我们需要查看更多您的代码。如果上面粘贴的 JSON 是 jsonDoc 变量的值,那么它不会成功反序列化为 CarouselItem,因为结构(可能)不匹配......
  • 嗨丹尼尔,你还需要什么其他代码
  • 看看 json2csharp 生成的类会很有价值。
  • 嗨丹尼尔,添加了所有课程
  • 你的 json 是一个数组。 JsonConvert.DeserializeObject&lt;List&lt;RootObject&gt;&gt;(originaljson);

标签: c# json umbraco7


【解决方案1】:

您似乎在反序列化到错误的对象。

您在上面发布的 JSON 实际上映射到 RootObject 类型的 数组

所以,你应该把它反序列化成这样:

var rootObjects = JsonConvert.DeserializeObject<RootObject[]>(jsonDoc);

从那里,您可以通过访问其成员获得必要的CarouselItem

var singleRootObject = rootObjects[0];
var carouselItem = singleRootObject.value.value.carouselItem[0];

【讨论】:

  • 嗨丹尼尔,这是为了给我指明正确的方向,我对你的代码做了一点点 var jsonDoc = control.JObject.ToString(); var myDetails = JsonConvert.DeserializeObject(jsonDoc); var carouselItem = myDetails.value.value.carouselItem[0].textToDisplay;字符串测试 = 轮播项目;现在它可以工作了
【解决方案2】:

创建一个如下所示的包装类,

public class WrapperEntity
{
    public Value Value { get; set; }

}

然后反序列化到那个 WrapperEntity,

 var deserialized = JsonConvert.DeserializeObject<WrapperEntity>(sb);

        var textToDisplay = deserialized.Value.value.carouselItem[0].textToDisplay;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多