如何解码JSON

时间:2012-06-21 08:37:34

标签: c# json

我的JSON格式如下:

{ "news": 
   [ 
     { "fb": { "message": "try", "user": "789" } },
     { "feed": { "abstract": "cool", "title": "hey" } },
     { "tw": { "tweetid": "984327", "user": "gart"  } },
     { "fb": { "message": "fgt", "user": "690" } },
     { "tw": { "tweetid": "346", "user": "nfgdr" } },
     { "feed": { "abstract": "gredf", "title": "wret" } }
   ] 
}

我已经替换了双引号,以便它可以存储在字符串中。

现在,当我尝试使用以下方法反序列化时:

JavaScriptSerializer jss = new JavaScriptSerializer();

jss.Deserialize<XYZType>(data);

出现以下错误:

Invalid object passed in, member name expected. (1): {"news":[{"fb":{"message":"try","user":"789"}},{"feed":{"title":"hey","abstract":"cool"}},{"tw":{"tweetid":"984327","user":"gart"}},{"fb":{"message":"fgt","user":"690"}},{"tw":{"tweetid":"346","user":"nfgdr"}},{"feed":{"title":"wret","abstract":"gredf"}}]}

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

我会看看Json.Net并停止“手动”尝试修复内容并让系统/库为您完成。此外,JavaScriptSerializer有点不稳定......

答案 1 :(得分:2)

CONT :除非将“news”数组序列化为一个对象数组,否则数组中的对象不均匀这一事实肯定会让你在尝试序列化时遇到麻烦JSON成为C#对象。

如果您可以控制JSON(源代码),则需要更好地构造它以便于序列化为C#对象。如果你可以让JSON采用结构:

{ "news": 
    [ 
        { 
            "fb": { "message": "try", "user": "789" },
            "feed": { "abstract_": "cool", "title": "hey" },
            "tw": { "tweetid": "984327", "user": "gart"  } 
        },
        { 
            "fb": { "message": "fgt", "user": "690" },
            "tw": { "tweetid": "346", "user": "nfgdr" },
            "feed": { "abstract_": "gredf", "title": "wret" }
        }
    ] 
}

这种结构很容易通过以下结构的XYZType类型反序列化:

class XYZType
{
    NewsType[] news { get; set; }

    public class NewsType
    {
        FBType fb { get; set; }
        FeedType feed { get; set; }
        TweetType tw { get; set; }

        public class FBType
        {
            string message { get; set; }
            string user { get; set; }
        }

        public class FeedType
        {
            string title { get; set; }
            string abstract_ { get; set; }
        }

        public class TweetType
        {
            string tweetid { get; set; }
            string user { get; set; }
        }   
    }
}

注意

1)你不能在C#中有一个名为“abstract”的标识符,所以我故意将“abstract”改为“abstract _”

2)嵌入“容器”类是可选的。你可以让它们“不嵌入”

答案 2 :(得分:0)

您不能只删除引号以将其存储在字符串中。然后它是无效的Json!您需要分隔报价

"{\"news\":[{\"fb\":{\"message\":\"try\",\"user\":\"789\"}},etc."