dattaprasaddhuri Ответов: 3

Как преобразовать строку json в список?


Я использую почтовую службу rest в своем приложении c#, которое отправляет результат jsonstring. Я хочу преобразовать этот результат в список, но он дает ошибку.


выходная строка:-

{"SearchDocumentResult":"[{\"ContextType\":\"ddd\",\"ContextIDPrimary\":\"TestContextP\",\"ContextIDSecondary\":\"TestContextS\",\"ContextIDTertiary\":\"\",\"RequirementID\":\"17\",\"Source\":\"image\",\"DocumentName\":\"4.pdf\",\"DocumentImage\":\"\",\"ErrorCode\":\"0\",\"ErrorDescription\":\"\",\"createdBy\":\"\",\"createdDate\":\"12-07-2017 15:39:57\"},{\"ContextType\":\"ddd\",\"ContextIDPrimary\":\"TestContextP\",\"ContextIDSecondary\":\"TestContextS\",\"ContextIDTertiary\":\"\",\"RequirementID\":\"18\",\"Source\":\"image\",\"DocumentName\":\"4.pdf\",\"DocumentImage\":\"\",\"ErrorCode\":\"0\",\"ErrorDescription\":\"\",\"createdBy\":\"\",\"createdDate\":\"12-07-2017 15:42:07\"}]"}


Я получаю выше вывод в виде строки json . Я не могу преобразовать приведенную выше строку в список. Может ли кто-нибудь помочь мне в этом?

Что я уже пробовал:

public class test
        {
            public string ContextType { get; set; }
            public string ContextIDPrimary { get; set; }
            public string ContextIDSecondary { get; set; }
            public string ContextIDTertiary { get; set; }
            public string Source{get;set;}
            public string DocumentID { get; set; }
                
        }

public class JsonHelper
   {
       /// <summary>
       /// JSON Serialization
       /// </summary>
       public static string JsonSerializer<T>(T t)
       {
           DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
           MemoryStream ms = new MemoryStream();
           ser.WriteObject(ms, t);
           string jsonString = Encoding.UTF8.GetString(ms.ToArray());
           ms.Close();
           return jsonString;
       }
       /// <summary>
       /// JSON Deserialization
       /// </summary>
       public static T JsonDeserialize<T>(string jsonString)
       {
           DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
           MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
           T obj = (T)ser.ReadObject(ms);
           return obj;
       }
   }


public class RootObject
    {
       // public List<SearchDocumentResult> SearchDocumentResult { get; set; }

        public IEnumerable<SearchDocumentResult> SearchDocumentResult { get; set; }

        //public List<Person> People1 { get; set; }
    }


protected void Button1_Click(object sender, EventArgs e)
        {
          

            test t = new test
            {
                ContextType = "ddd",
                ContextIDPrimary = "",
                ContextIDSecondary = "",
                ContextIDTertiary = " ",
                Source = "",
                DocumentID = ""

            };

            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(test));
            MemoryStream mem = new MemoryStream();
            ser.WriteObject(mem, t);
            string data = Encoding.UTF8.GetString(mem.ToArray(), 0, (int)mem.Length);
            WebClient webClient = new WebClient();
            webClient.Headers["Content-type"] = "application/json";
            webClient.Encoding = Encoding.UTF8;
            string result = webClient.UploadString("http://192.168.0.151:222/Service1.svc/SearchDocument", "POST", data);

            var result11 = JsonHelper.JsonDeserialize<RootObject1>(result);

            //JavaScriptSerializer serializer = new JavaScriptSerializer();
            //serializer.MaxJsonLength = Int32.MaxValue;
           
           // var a = serializer.Deserialize(result, typeof(object));
          

          // string json = "{\"People\":[{\"FirstName\":\"Hans\",\"LastName\":\"Olo\"},{\"FirstName\":\"Jimmy\",\"LastName\":\"Crackedcorn\"}]}";

          //// var result11 = JsonHelper.JsonDeserialize<RootObject1>(json);

          // var firstNames = result11.People.Select(p => p.FirstName).ToList();
          // var lastNames = result11.People.Select(p => p.LastName).ToList();

        }

3 Ответов

Рейтинг:
1

londhess

попробуйте что-нибудь вроде этого.

var testString={"SearchDocumentResult":"[{\"ContextType\":\"ddd\",\"ContextIDPrimary\":\"TestContextP\",\"ContextIDSecondary\":\"TestContextS\",\"ContextIDTertiary\":\"\",\"RequirementID\":\"17\",\"Source\":\"image\",\"DocumentName\":\"4.pdf\",\"DocumentImage\":\"\",\"ErrorCode\":\"0\",\"ErrorDescription\":\"\",\"createdBy\":\"\",\"createdDate\":\"12-07-2017 15:39:57\"},{\"ContextType\":\"ddd\",\"ContextIDPrimary\":\"TestContextP\",\"ContextIDSecondary\":\"TestContextS\",\"ContextIDTertiary\":\"\",\"RequirementID\":\"18\",\"Source\":\"image\",\"DocumentName\":\"4.pdf\",\"DocumentImage\":\"\",\"ErrorCode\":\"0\",\"ErrorDescription\":\"\",\"createdBy\":\"\",\"createdDate\":\"12-07-2017 15:42:07\"}]"};

var result = JsonConvert.DeserializeObject<List<test>>(json);


dattaprasaddhuri

пробовал, но не получилось.
давая следующее сообщение об ошибке:
Newtonsoft.Json.dll но не был обработан в пользовательском коде

Дополнительная информация: невозможно десериализовать текущий объект JSON (например, {"name": "value"}) в тип 'System.Коллекции.Generic. List`1[WebApplication1.test]', поскольку для правильной десериализации типа требуется массив JSON (например, [1,2,3]).

Чтобы исправить эту ошибку, либо измените JSON на массив JSON (например, [1,2,3]), либо измените десериализованный тип так, чтобы он был нормальным .Чистый тип (например, не примитивный тип, такой как integer, не тип коллекции, такой как array или List<t>), который может быть десериализован из объекта JSON. JsonObjectAttribute также может быть добавлен к типу, чтобы заставить его десериализоваться из объекта JSON.

Путь 'SearchDocumentResult', строка 1, позиция 24.

Рейтинг:
0

Andy Lanng

Посмотреть вверх Newtonsoft[^]. В наши дни это в значительной степени отраслевой стандарт.

Получите его с помощью NuGet. Существует множество инструкций по всему переплетению, но вот как их использовать:

var myTest = Movie m = JsonConvert.DeserializeObject<test[]>(json);


Вы "можете" даже просто десериализоваться в динамический объект, но всегда лучше создавать свои собственные классы, как вы это сделали

Обновление: справедливое замечание, это не будет работать из коробки с JSON выше.

Вы можете десериализовать массив, но вы должны десериализовать его в объект списка.

Первая проблема заключается в том, что ваш json содержит подстроку json. Сначала вам придется десериализовать это:

var searchResult = JObject.Parse(json).SearchDocumentResult; //dynamic but gets string
//then you can deserialize that:
var myTest = Movie m = JsonConvert.DeserializeObject<List<test>>(json);


dattaprasaddhuri

Я уже пробовал это сделать, но получаю следующую ошибку:
Невозможно десериализовать текущий объект JSON (например, {"name": "value"}) в тип 'WebApplication1.test []', поскольку для правильной десериализации этого типа требуется массив JSON (например, [1,2,3]).
Чтобы исправить эту ошибку, либо измените JSON на массив JSON (например, [1,2,3]), либо измените десериализованный тип так, чтобы он был нормальным .Чистый тип (например, не примитивный тип, такой как integer, не тип коллекции, такой как array или List<t>), который может быть десериализован из объекта JSON. JsonObjectAttribute также может быть добавлен к типу, чтобы заставить его десериализоваться из объекта JSON.
Путь 'SearchDocumentResult', строка 1, позиция 24.

Andy Lanng

Я обновил решение. Извините, у меня нет времени полностью протестировать >_ & lt;

Рейтинг:
0

F-ES Sitecore

Все зависит от того, что находится в "результате". Если это просто JSON, то вам нужно десериализоваться в список<test & gt;, поскольку он представляет собой массив тестовых объектов.

string result = "[{\"ContextType\":\"ddd\",\"ContextIDPrimary\":\"TestContextP\",\"ContextIDSecondary\":\"TestContextS\",\"ContextIDTertiary\":\"\",\"RequirementID\":\"17\",\"Source\":\"image\",\"DocumentName\":\"4.pdf\",\"DocumentImage\":\"\",\"ErrorCode\":\"0\",\"ErrorDescription\":\"\",\"createdBy\":\"\",\"createdDate\":\"12-07-2017 15:39:57\"},{\"ContextType\":\"ddd\",\"ContextIDPrimary\":\"TestContextP\",\"ContextIDSecondary\":\"TestContextS\",\"ContextIDTertiary\":\"\",\"RequirementID\":\"18\",\"Source\":\"image\",\"DocumentName\":\"4.pdf\",\"DocumentImage\":\"\",\"ErrorCode\":\"0\",\"ErrorDescription\":\"\",\"createdBy\":\"\",\"createdDate\":\"12-07-2017 15:42:07\"}]";

var result11 = JsonHelper.JsonDeserialize<List<test>>(result);


Если "результат" имеет xml вокруг него, вам нужно будет использовать что-то вроде XmlDocument, чтобы извлечь JSON из XML, а затем сделать то, что описано выше.


dattaprasaddhuri

Не работать