Преобразование XML-оператора Linq в JSON - PullRequest
0 голосов
/ 18 января 2011

В настоящее время я использую linq для анализа XML-канала для мобильного приложения со следующим кодом:

            var Questions = from myQuestion in IXML.Descendants("item")
                            let Anonymous = myQuestion.Element("asked_by").HasElements == false
                            let Identifiable = myQuestion.Element("asked_by").HasElements == true
                            where Identifiable || Anonymous
                            select new Question
                            {
                                AskedQuestion = ParseText.PlainText(myQuestion.Element("question").Value),
                                ID = Convert.ToInt64(myQuestion.Element("id").Value),
                                Author_UserName = (Identifiable ? (String)ParseText.PlainText(myQuestion.Element("asked_by").Element("username").Value) : String.Empty),
                                Author_RealName = (Identifiable ? (String)ParseText.PlainText(myQuestion.Element("asked_by").Element("name").Value.ToLower()) : "anonymous"),
                                Author_PhotoURL = (Identifiable ? (String)ParseText.PlainText(myQuestion.Element("asked_by").Element("photo_url").Value) : String.Empty)
                            };

Теперь я переключился на канал JSON вместо преимуществ меньшегоРазмеры загрузки (это мобильное приложение), и я использую JSON.NET.Тем не менее, я не могу получить утверждение linq для этого совершенно верно?Я не очень разбираюсь в этой области, и я нигде не могу найти полезных указателей, так что вот, вот что у меня есть:

var Questions = from m in o["response"].Children()
                              let Anonymous = m["asked_by"].Values() == null
                              let Identifiable = m["asked_by"].Values() != null
                              where Identifiable || Anonymous
                              select new Question
                              {
                                  AskedQuestion = ParseText.PlainText((string)m["question"]),
                                  ID = (Int64)m["id"],
                                  Author_UserName = (Identifiable ? (String)ParseText.PlainText((string)m["asked_by"]["username"]) : String.Empty),
                                  Author_RealName = (Identifiable ? (String)ParseText.PlainText((string)m["asked_by"]["name"]) : "anonymous"),
                                  Author_PhotoURL = (Identifiable ? (String)ParseText.PlainText((string)m["asked_by"]["photo_url"]) : String.Empty)
                              };

К сожалению, это не работает - я предполагаюЯ выбираю условия для анонимной / идентифицируемой работы, но я не уверен, как это сделать.Также по какой-то причине

ID = (Int64)m["id"]

тоже не работает,

приведен фрагмент некоторой строки JSON, которую я пытаюсь проанализировать, если это поможет: /

{"status":"ok","response":[{"id":"3740995599","question":"Have you ever had bumper stickers on your car? If so, what were they?","time":"Mon, 17 Jan 2011 14:44:29 -0500","asked_by":{"username":"ade","name":"Ade Olonoh","website":"http:\/\/about.me\/ade","location":"San Francisco, CA","bio":"Formspring CEO\/Founder","accept_anonymous":true,"protected":false,"photo_url":"http:\/\/files-cdn.formspring.me\/profile\/20100119\/4b56705e1b776_thumb.jpg","answered_count":718,"taking_questions":true,"is_following":true}},{"id":"3710380191","question":"who do you like?? ( :","time":"Sun, 16 Jan 2011 07:10:07 -0500","asked_by":""},{"id":"3708438239" ................"}] }

Есть идеи?Буду очень признателен,

Спасибо, парень!

1 Ответ

0 голосов
/ 18 января 2011

Это может работать: используйте DataContractJsonSerializer, как описано в Сериализация JSON .

// Assuming that 'questions' contains the data returned from the LINK statement.
var questionsStream = new MemoryStream();
DataContractJsonSerializer jsonSerializer
    = new DataContractJsonSerializer(typeof(questions));
jsonSerializer.WriteObject(questionsStream, questions);

var streamReader = new StreamReader(questionsStream);
string jsonOutput = streamReader.ReadToEnd();

Я не уверен, что вызов typeof будет работать, так как Quesions - анонимный тип. Если этого не произойдет, вы должны объявить класс и скопировать в него результат. Примерно так:

[DataContract]
class Questions
{
    [DataMember]
    IEnumerable<Question> AllQuestions { get; set; }
}

var typedQuestions = new Questions();
typeQuesions.AllQuestions =
    from m in ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...