s yu Ответов: 1

Как десериализовать объект и получить значения элементов?


Используя приведенный ниже код,
HttpContext context.Response.ContentType = "application/json";
var data = context.Request;
var sr = new StreamReader(data.InputStream);
var stream = sr.ReadToEnd();
var javaScriptSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
var obj = javaScriptSerializer.DeserializeObject(stream);
object[] arr = (object[])obj;

Результат работы Арр получен. В районе 3-уровневый объект Array. Например, ниже показано на панели часов:
Name   Value            Type
arr[2] {object[3]       object{object[]}
   [0] {object[2]       object{object[]}
   [1] {object[2]       object{object[]}
   [2] {object[2]       object{object[]}
      [0] "6512"        object{string}
      [1] "In Invert"   object{string}

Я попытался получить значения элементов, например arr[2][2][2], но потерпел неудачу.
Затем из непосредственного окна я извлек arr[2] (см. ниже).
arr[2].GetType()
{Name = "Object[]" FullName = "System.Object[]"}
    [System.RuntimeType]: {Name = "Object[]" FullName = "System.Object[]"}
    base {System.Reflection.MemberInfo}: {Name = "Object[]" FullName = "System.Object[]"}
    Assembly: {mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089}
    AssemblyQualifiedName: "System.Object[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
    Attributes: Public | Sealed | Serializable
    BaseType: {Name = "Array" FullName = "System.Array"}
    ContainsGenericParameters: false
    DeclaringMethod: 'obj.GetType().DeclaringMethod' threw an exception of type 'System.InvalidOperationException'
    DeclaringType: null
    FullName: "System.Object[]"
    GenericParameterAttributes: 'obj.GetType().GenericParameterAttributes' threw an exception of type 'System.InvalidOperationException'
    GenericParameterPosition: 'obj.GetType().GenericParameterPosition' threw an exception of type 'System.InvalidOperationException'
    GenericTypeArguments: {System.Type[0]}
    GUID: {00000000-0000-0000-0000-000000000000}
    HasElementType: true
    IsAbstract: false
    IsAnsiClass: true
    IsArray: true
    IsAutoClass: false
    IsAutoLayout: true
    IsByRef: false
    IsClass: true
    IsCOMObject: false
    IsConstructedGenericType: false
    IsContextful: false
    IsEnum: false
    IsExplicitLayout: false
    IsGenericParameter: false
    IsGenericType: false
    IsGenericTypeDefinition: false
    IsImport: false
    IsInterface: false
    IsLayoutSequential: false
    IsMarshalByRef: false
    IsNested: false
    IsNestedAssembly: false
    IsNestedFamANDAssem: false
    IsNestedFamily: false
    IsNestedFamORAssem: false
    IsNestedPrivate: false
    IsNestedPublic: false
    IsNotPublic: false
    IsPointer: false
    IsPrimitive: false
    IsPublic: true
    IsSealed: true
    IsSecurityCritical: false
    IsSecuritySafeCritical: false
    IsSecurityTransparent: true
    IsSerializable: true
    IsSpecialName: false
    IsUnicodeClass: false
    IsValueType: false
    IsVisible: true
    MemberType: TypeInfo
    Module: {CommonLanguageRuntimeLibrary}
    Namespace: "System"
    ReflectedType: null
    StructLayoutAttribute: null
    TypeHandle: {System.RuntimeTypeHandle}
    TypeInitializer: null
    UnderlyingSystemType: {Name = "Object[]" FullName = "System.Object[]"}

Поскольку его свойство IsEnm является ложным, Я не знаю, как я могу получить подобъекты: arr[2][0] и arr[2][1].
Я не знаю, есть ли способ преобразовать object[] в object, чтобы я мог получить вложенные объекты.
Надеюсь, кто-то сможет помочь в этом вопросе. Спасибо.

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

Как десериализовать объект и получить значения элементов?

F-ES Sitecore

Десериализовать где? В коде .net? В JavaScript? Вы гуглили "c# deserialise object" и следили за многими статьями и учебниками?

s yu

Я сделал это успешно для 2-го уровня ( Уровень 1: object{object []}, Уровень 2: object{string} Object array from string (имя переменной: stream, см. выше). Теперь мне нужно сделать это на 3-м уровне. Мне нужно десерилизировать Уровень 1: object{object[]} в Уровень 2: object{object[]}. Тогда я должен быть в состоянии дополнительно десерилизировать Уровень 2: object{object[]} до уровня 3 object{string}. Я застрял на десерилизации объекта{object[]} в объект другого уровня{object[]}. Спасибо за Ваш отзыв.

[no name]

Другим ответом было бы прочитать ответы, которые вы уже получили.

1 Ответов

Рейтинг:
2

David_Wimbley

Вы не указали проблему с вашим кодом, но поскольку вы ожидаете, что кто-то ответит, вот один из вариантов.

1) Используйте Newtonsoft.Библиотека Json вместо библиотеки .net - Json.NET - Newtonsoft[^]

2) Перейти к json2csharp.com и преобразуйте вашу строку json в классы C# - json2csharp-генерация классов c# из json[^]

Это создаст классы на основе вашего вложенного / многомерного массива, которые можно сериализовать / десериализовать с помощью JSON.net библиотека

3) чтобы сериализовать свою структуру классов в JSON, вы должны сделать что-то вроде этого

string json = JsonConvert.SerializeObject(myJson2CsharpModel);


4) чтобы десериализовать его, вы бы сделали что-то вроде

MyJson2CsharpModel model = JsonConvert.DeserializeObject<MyJson2CsharpModel>(json);


s yu

Дэвид: большое спасибо за ваш ответ, экстрасенс. источник в 2). Я попробовал json2sharp для строки json (см. ниже), которая генерируется из
строку JSON = JsonConvert.SerializeObject(трансляция, форматирование.Изрезанный);
Но я получил сообщение ниже:
"Разбор вашего JSON не сработал. Пожалуйста, убедитесь, что он действителен. Уже сделал это? Пожалуйста, дайте мне знать, чтобы я мог это исправить."
Я должен объяснить здесь кое-что еще. В своем JavaScript-коде я создаю массив, а затем помещаю в него 4 массива (разной структуры). Затем составленный массив отправляется через AJAX. В мой .данного, у меня есть JSON-строку.
В моем случае мне нужно дополнительно десериализовать объект, содержащий 4 объекта, в субобъекты, если этот субобъект является {object []}, а не {object:string}. У вас есть какие-нибудь идеи, как справиться с этим делом? Спасибо снова.

// строка формата JSON
"[[\"C04R032\",\ " OB-C-3J\",\ " C04\",\"TRACKWAY\",\"PRIVATE\",\ " BRASS DISK\",38.900749999999995,-77.05172999999999],[\"75+82.00\",\"OUTBOUND\",\"\",\"\",\"SCS\"],[[\"6512\",\"в INVERT\"],[\"15977\",\"null\"]],[[\"\",\"\",\"METRO\",\"5/28/1905\",\"SET\",\"388713.741\",\"785235.645\",\"\",\"\",\"\"],[\"\",\"ADJUSTED\",\"NAD27MD\",\"5/28/1905\",\"SET\",\"388691.5843\",\"785190.8866\",\"\",\"\",\"\"],[\"\",\"PGIS\",\"NAD83MD1991\",\"\",\"RECNORECORD\",\"449439.865\",\"1297611.009\",\"\",\"\",\"\"],[\"\",\"PGIS\",\"LDPNSRS2007\",\"\",\"RECNORECORD\",\"174553.7598\",\"194763.7164\",\"\",\"\",\"\"]]]"

s yu

Я решил применить другой подход к обработке данных. Спасибо.