C #: Unable to check if type is an array

I am creating a special library for converting an array of objects into a json string, as well as publishing it. I recently ran into a problem when I cannot detect an internal array.

public static string ConvertArray( params object[] jsonData ) {
        if( jsonData.Length % 2 != 0 ) throw new ArgumentException( string.Format( "Key \'{0}\' missing value", jsonData[jsonData.Length - 1] ) );
        string json = "{";
        for( int i = 0; i < jsonData.Length; ) {
            json += string.Format( "\"{0}\":", jsonData[i++] );
            if( jsonData[i] is string ) {
                Console.WriteLine( "Found a string" );
                json += string.Format( "\"{0}\",", jsonData[i++] );
            } else if( jsonData[i].GetType( ).IsArray ) {
                Console.WriteLine( "Found an internal array" );
                json += string.Format( "{0},", ConvertArray( jsonData[i++] ) );
            } else {
                if( jsonData[i] is byte || jsonData[i] is sbyte || jsonData[i] is int || jsonData[i] is uint || jsonData[i] is short || jsonData[i] is ushort || jsonData[i] is long || jsonData[i] is ulong || jsonData[i] is float || jsonData[i] is double || jsonData[i] is bool || jsonData[i] is decimal ) {
                    Console.WriteLine( "Found a generic" );
                    json += string.Format( "{0},", jsonData[i++] );
                } else if( jsonData[i] is char ) {
                    Console.WriteLine( "Found a char" );
                    json += string.Format( "\'{0}\',", jsonData[i++] );
                } else {
                    Console.WriteLine( "Found an object" );
                    object work = jsonData[i++];
                    try {
                        MethodInfo workMethod = work.GetType().GetMethod("ToJsonString");
                        json += string.Format( "{0},", workMethod.Invoke( work, new object[] { } ) );
                    } catch {
                        try {
                            using( MemoryStream memStr = new MemoryStream( ) ) {
                                new BinaryFormatter( ).Serialize( memStr, work );
                                memStr.Seek( 0, SeekOrigin.Begin );
                                using( StreamReader strReader = new StreamReader( memStr ) ) {
                                    json += string.Format( "\"{0}\",", strReader.ReadToEnd( ) );
                                }
                            }
                        } catch {
                            throw new ArgumentException( "The value for key \'{0}\' does not contain a public method ToJsonString and cannot be serialized" );
                        }
                    }
                }
            }
        }
        return json + "}";
    }

I run it with:

string jsonString = JsonWebUtil.ConvertArray( new object[] {
            "jsonrpc","2.0",
            "method","generateIntegers",
            "params",JsonWebUtil.ConvertArray( new object[] {
                "apiKey", "<REDACTED>",
                "n", 14,
                "min", 0,
                "max", 10,
            } ),
            "id", 10461
        } );

And I get the following output:

{"jsonrpc":"2.0","method":"generateIntegers","params":"{"apiKey":"<REDACTED>","n":14,"min":0,"max":10,}","id":10461,}

There should be no quotes in the internal array. And when it goes through my code, the console shows that it shows up as what I declared as generics. I have no idea why it is jsonData[i].getType().IsArraynot returning the correct value.

+4
source share
1 answer

- . , , . JsonWebUtil.ConvertArray, .

, - :

string jsonString = JsonWebUtil.ConvertArray( new object[] {
        "jsonrpc","2.0",
        "method","generateIntegers",
        "params", new object[] {
            "apiKey", "<REDACTED>",
            "n", 14,
            "min", 0,
            "max", 10,
            } ,
        "id", 10461
    } );

, :

  • ,
  • , , ToJsonString - , workMethod ?
+4

Source: https://habr.com/ru/post/1622407/


All Articles