JsonConvert帮助从文件中读取

时间:2015-12-04 09:23:01

标签: c# json.net

我试图从这个json文件中读取,问题是我没有收到任何信息,1357总是在变化。

这是文件的一部分

{
    "result": {
        "1357": {
            "Random": "4NUX4oFJZEHLbXH5ApeO4",
            "Random2": "Co04DEVlxkKgpou-6kej",

我正在使用的课程

using System;
using System.IO;
using Newtonsoft.Json;

namespace MyNamespace
{
    public class ReadRandom
    {
        public static ReadRandom Fetch(string filename)
        {
            TextReader reader = new StreamReader(filename);
            string json = reader.ReadToEnd();
            reader.Close();

            ReadRandomResult AssetClassInfoResult = JsonConvert.DeserializeObject<ReadRandomResult>(json);

            return AssetClassInfoResult.result;
        }

        [JsonProperty("Random")]
        public string Random { get; set; }

        [JsonProperty("Random2")]
        public string Random2 { get; set; }


        protected class ReadRandomResult
        {
            public ReadRandom result { get; set; }
        }

    }
}

其中一个答案的错误

Exception thrown: 'System.ArgumentException' in Newtonsoft.Json.dll
Exception thrown: 'Newtonsoft.Json.JsonSerializationException' in Newtonsoft.Json.dll
Exception thrown: 'Newtonsoft.Json.JsonSerializationException' in Newtonsoft.Json.dll
Exception thrown: 'Newtonsoft.Json.JsonSerializationException' in Newtonsoft.Json.dll
Exception thrown: 'Newtonsoft.Json.JsonSerializationException' in Newtonsoft.Json.dll
Exception thrown: 'System.Reflection.TargetInvocationException' in mscorlib.dll
An unhandled exception of type 'System.Reflection.TargetInvocationException' occurred in mscorlib.dll
Additional information: Exception has been thrown by the target of an invocation.

http://pastebin.com/Hvp4CXXw

我试图阅读&#34; icon_url&#34; 在此之下的一些事情。 对不起,我没有发布之前认为我不需要它 在示例中使用它时,您发布了一个更改键,右键,我仍然崩溃。

4 个答案:

答案 0 :(得分:2)

问题在于你已经获得了额外的&#34;层&#34;在result属性与包含RandomRandom2的对象之间。看起来你想要像:

class ReadRandomResult
{
    public Dictionary<string, ReadRandom> Result { get; set; }
}

然后您就可以使用:

var container = JsonConvert.DeserializeObject<ReadRandomResult>(json);
var result = container.Result["1357"];

作为备注,我强烈建议您将ReadRandomResult课程移到ReadRandom之外......拥有一个&#34;容器&#34;这是非常不寻常的。 class nested inside 它包含的类。这可能会引起混淆。

这是一个简短但完整的例子:

using System;
using System.Collections.Generic;
using System.IO;

using Newtonsoft.Json;

class ReadRandom
{
    [JsonProperty("Random")]
    public string Random { get; set; }

    [JsonProperty("Random2")]
    public string Random2 { get; set; }
}

class ReadRandomContainer
{
    [JsonProperty("Result")]
    public Dictionary<string, ReadRandom> Result { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var json = File.ReadAllText("test.json");
        var container = JsonConvert.DeserializeObject<ReadRandomContainer>(json);
        Console.WriteLine(container.Result["1357"].Random);
    }
}

test.json的内容:

{
    "result": {
        "1357": {
            "Random": "4NUX4oFJZEHLbXH5ApeO4",
            "Random2": "Co04DEVlxkKgpou-6kej"
        }
    }
}

输出:

4NUX4oFJZEHLbXH5ApeO4

答案 1 :(得分:0)

您发布的json似乎无效。解析器无法读取它。

---编辑:

至少你需要

{
    "result": {
        "1357": {
            "Random": "4NUX4oFJZEHLbXH5ApeO4",
            "Random2": "Co04DEVlxkKgpou-6kej"
        }
    }
}

答案 2 :(得分:0)

您忽略了1357这一事实。假设你有以下JSON:

{
    "result": {
        "1357": {
            "Random": "4NUX4oFJZEHLbXH5ApeO4",
            "Random2": "Co04DEVlxkKgpou-6kej"
        } 
    }
}

您的result不是ReadRandom,而是Dictionary<string, ReadRandom>

这个应该有效:

public class ReadRandom
{
    public static Dictionary<string, ReadRandom> Fetch(string filename)
    {
        TextReader reader = new StreamReader(filename);
        string json = reader.ReadToEnd();
        reader.Close();

        return JsonConvert.DeserializeObject<ReadRandomResult>(json).result;
    }

    [JsonProperty("Random")]
    public string Random { get; set; }

    [JsonProperty("Random2")]
    public string Random2 { get; set; }


    protected class ReadRandomResult
    {
        public Dictionary<string, ReadRandom> result { get; set; }
    }
}

// Usage example:
string random = ReadRandom.Fetch(@"C:\filename.txt")["1357"].Random;

我的意见是:在模型类中实现Fetch并不是一个好主意。最好是实现ReadRandomParse这样会返回ReadRandomResult

的内容

答案 3 :(得分:0)

检查此链接,其中json字符串具有动态键,它们使用Idictionary,然后迭代。 Deserializing JSON with dynamic keys。然后从剩余的字符串中,您可以再次反序列化到您想要的对象